+/* Licensed under LGPLv2.1+ - see LICENSE file for details */
#ifndef CCAN_CAST_H
#define CCAN_CAST_H
#include "config.h"
* only differs in signed/unsigned, not in type or const-ness.
*/
#define cast_signed(type, expr) \
- ((type)(expr) \
- + BUILD_ASSERT_OR_ZERO(cast_sign_compatible(type, (expr))))
+ (0 ? BUILD_ASSERT_OR_ZERO(cast_sign_compatible(type, (expr))) : \
+ (type)(expr))
/**
* cast_const - remove a const qualifier from a pointer.
* This ensures that you are only removing the const qualifier from an
* expression. The expression must otherwise match @type.
*
+ * We cast via intptr_t to suppress gcc's -Wcast-qual (which SAMBA
+ * uses), and via the ? : so Sun CC doesn't complain about the result
+ * not being constant.
+ *
* If @type is a pointer to a pointer, you must use cast_const2 (etc).
*
* Example:
* {
* size_t i;
* for (i = 0; i < strlen(haystack); i++)
- * if (memcmp("needle", haystack+i, strlen("needle")) == 0)
- * return cast_const(char *, haystack+i);
+ * if (memcmp("needle", haystack+i, strlen("needle")) == 0)
+ * return cast_const(char *, haystack+i);
* return NULL;
* }
*/
#define cast_const(type, expr) \
- ((type)((intptr_t)(expr) \
- + BUILD_ASSERT_OR_ZERO(cast_const_compat1((expr), type))))
+ (0 ? BUILD_ASSERT_OR_ZERO(cast_const_compat1((expr), type)) : \
+ (type)(intptr_t)(expr))
/**
* cast_const2 - remove a const qualifier from a pointer to a pointer.
* expression. The expression must otherwise match @type.
*/
#define cast_const2(type, expr) \
- ((type)((intptr_t)(expr) \
- + BUILD_ASSERT_OR_ZERO(cast_const_compat2((expr), type))))
+ (0 ? BUILD_ASSERT_OR_ZERO(cast_const_compat2((expr), type)) : \
+ (type)(intptr_t)(expr))
/**
* cast_const3 - remove a const from a pointer to a pointer to a pointer..
* expression. The expression must otherwise match @type.
*/
#define cast_const3(type, expr) \
- ((type)((intptr_t)(expr) \
- + BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), type))))
+ (0 ? BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), type)) : \
+ (type)(intptr_t)(expr))
/**
)
#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))