+/* 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>
/**
*/
#define cast_signed(type, expr) \
((type)(expr) \
- + EXPR_BUILD_ASSERT(cast_sign_compatible(type, (expr))))
+ + BUILD_ASSERT_OR_ZERO(cast_sign_compatible(type, (expr))))
/**
* cast_const - remove a const qualifier from a pointer.
* return NULL;
* }
*/
-#define cast_const(type, expr) \
- ((type)(expr) \
- + EXPR_BUILD_ASSERT(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) \
- + EXPR_BUILD_ASSERT(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) \
- + EXPR_BUILD_ASSERT(cast_const_compat3((expr), type)))
+#define cast_const3(type, expr) \
+ ((type)((intptr_t)(expr) \
+ + BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), 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 */