Browse Source

cast: fix compilation with GCC's -Wcast-qual

Samba uses -Wcast-qual to warn about casting away const.  The kind of
coders who care about const correctness are likely to turn that option
on, so we should make sure it's compatible with cast_const().
Rusty Russell 15 years ago
parent
commit
1313203b72
1 changed files with 10 additions and 9 deletions
  1. 10 9
      ccan/cast/cast.h

+ 10 - 9
ccan/cast/cast.h

@@ -1,6 +1,7 @@
 #ifndef CCAN_CAST_H
 #define CCAN_CAST_H
 #include "config.h"
+#include <stdint.h>
 #include <ccan/build_assert/build_assert.h>
 
 /**
@@ -37,9 +38,9 @@
  *		return NULL;
  *	}
  */
-#define cast_const(type, expr)					\
-	((type)(expr)						\
-	 + BUILD_ASSERT_OR_ZERO(cast_const_compat1((expr), type)))
+#define cast_const(type, expr)						\
+	((type)((intptr_t)(expr)					\
+		+ BUILD_ASSERT_OR_ZERO(cast_const_compat1((expr), type))))
 
 /**
  * cast_const2 - remove a const qualifier from a pointer to a pointer.
@@ -49,9 +50,9 @@
  * This ensures that you are only removing the const qualifier from an
  * expression.  The expression must otherwise match @type.
  */
-#define cast_const2(type, expr)					\
-	((type)(expr)						\
-	 + BUILD_ASSERT_OR_ZERO(cast_const_compat2((expr), type)))
+#define cast_const2(type, expr)						\
+	((type)((intptr_t)(expr)					\
+		+ BUILD_ASSERT_OR_ZERO(cast_const_compat2((expr), type))))
 
 /**
  * cast_const3 - remove a const from a pointer to a pointer to a pointer..
@@ -61,9 +62,9 @@
  * This ensures that you are only removing the const qualifier from an
  * expression.  The expression must otherwise match @type.
  */
-#define cast_const3(type, expr)					\
-	((type)(expr)						\
-	 + BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), type)))
+#define cast_const3(type, expr)						\
+	((type)((intptr_t)(expr)					\
+		+ BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), type))))
 
 
 /**