+/* Licensed under LGPLv2.1+ - see LICENSE file for details */
#ifndef CCAN_CAST_H
#define CCAN_CAST_H
#include "config.h"
+#include <stdint.h>
#include <ccan/build_assert/build_assert.h>
/**
* 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.
* 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..
* 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))))
/**
)
#define cast_const_strip1(expr) \
- __typeof__(*(struct { int z; __typeof__(expr) x; }){0}.x)
+ __typeof__(*(union { int z; __typeof__(expr) x; }){0}.x)
#define cast_const_strip2(expr) \
- __typeof__(**(struct { int z; __typeof__(expr) x; }){0}.x)
+ __typeof__(**(union { int z; __typeof__(expr) x; }){0}.x)
#define cast_const_strip3(expr) \
- __typeof__(***(struct { int z; __typeof__(expr) x; }){0}.x)
+ __typeof__(***(union { int z; __typeof__(expr) x; }){0}.x)
#define cast_const_compat1(expr, type) \
__builtin_types_compatible_p(cast_const_strip1(expr), \
cast_const_strip1(type))
#else
#define cast_sign_compatible(type, expr) \
(sizeof(*(type)0) == 1 && sizeof(*(expr)) == 1)
-#define cast_const_compat1(expr, type) \
- (sizeof(*(expr)) == sizeof(*(type)0))
-#define cast_const_compat2(expr, type) \
- (sizeof(**(expr)) == sizeof(**(type)0))
-#define cast_const_compat3(expr, type) \
- (sizeof(***(expr)) == sizeof(***(type)0))
+#define cast_const_compat1(expr, type) (1)
+#define cast_const_compat2(expr, type) (1)
+#define cast_const_compat3(expr, type) (1)
#endif
#endif /* CCAN_CAST_H */