Make CHECK_TYPE_NONCONST macro portable

also replace __typeof -> typeof
This commit is contained in:
2014-08-02 18:03:50 +10:00
parent d98b6a289c
commit 88a0d5ebe8
3 changed files with 15 additions and 17 deletions

View File

@@ -474,14 +474,14 @@ enum InterpolationType {
* ... the compiler optimizes away the temp var */ * ... the compiler optimizes away the temp var */
#ifdef __GNUC__ #ifdef __GNUC__
#define CHECK_TYPE(var, type) { \ #define CHECK_TYPE(var, type) { \
__typeof(var) *__tmp; \ typeof(var) *__tmp; \
__tmp = (type *)NULL; \ __tmp = (type *)NULL; \
(void)__tmp; \ (void)__tmp; \
} (void)0 } (void)0
#define CHECK_TYPE_PAIR(var_a, var_b) { \ #define CHECK_TYPE_PAIR(var_a, var_b) { \
__typeof(var_a) *__tmp; \ typeof(var_a) *__tmp; \
__tmp = (__typeof(var_b) *)NULL; \ __tmp = (typeof(var_b) *)NULL; \
(void)__tmp; \ (void)__tmp; \
} (void)0 } (void)0
#else #else

View File

@@ -163,7 +163,7 @@ static const int NAN_INT = 0x7FC00000;
#ifndef CHECK_TYPE #ifndef CHECK_TYPE
#ifdef __GNUC__ #ifdef __GNUC__
#define CHECK_TYPE(var, type) { \ #define CHECK_TYPE(var, type) { \
__typeof(var) *__tmp; \ typeof(var) *__tmp; \
__tmp = (type *)NULL; \ __tmp = (type *)NULL; \
(void)__tmp; \ (void)__tmp; \
} (void)0 } (void)0

View File

@@ -157,39 +157,38 @@
* ... the compiler optimizes away the temp var */ * ... the compiler optimizes away the temp var */
#ifdef __GNUC__ #ifdef __GNUC__
#define CHECK_TYPE(var, type) { \ #define CHECK_TYPE(var, type) { \
__typeof(var) *__tmp; \ typeof(var) *__tmp; \
__tmp = (type *)NULL; \ __tmp = (type *)NULL; \
(void)__tmp; \ (void)__tmp; \
} (void)0 } (void)0
#define CHECK_TYPE_PAIR(var_a, var_b) { \ #define CHECK_TYPE_PAIR(var_a, var_b) { \
__typeof(var_a) *__tmp; \ typeof(var_a) *__tmp; \
__tmp = (__typeof(var_b) *)NULL; \ __tmp = (typeof(var_b) *)NULL; \
(void)__tmp; \ (void)__tmp; \
} (void)0 } (void)0
#define CHECK_TYPE_PAIR_INLINE(var_a, var_b) ((void)({ \ #define CHECK_TYPE_PAIR_INLINE(var_a, var_b) ((void)({ \
__typeof(var_a) *__tmp; \ typeof(var_a) *__tmp; \
__tmp = (__typeof(var_b) *)NULL; \ __tmp = (typeof(var_b) *)NULL; \
(void)__tmp; \ (void)__tmp; \
})) }))
#define CHECK_TYPE_NONCONST(var) { \
void *non_const = ((__typeof(var))NULL); \
(void)non_const; \
} (void)0
#else #else
# define CHECK_TYPE(var, type) # define CHECK_TYPE(var, type)
# define CHECK_TYPE_PAIR(var_a, var_b) # define CHECK_TYPE_PAIR(var_a, var_b)
# define CHECK_TYPE_PAIR_INLINE(var_a, var_b) (void)0 # define CHECK_TYPE_PAIR_INLINE(var_a, var_b) (void)0
# define CHECK_TYPE_NONCONST(var) (void)0
#endif #endif
/* can be used in simple macros */ /* can be used in simple macros */
#define CHECK_TYPE_INLINE(val, type) \ #define CHECK_TYPE_INLINE(val, type) \
((void)(((type)0) != (val))) ((void)(((type)0) != (val)))
#define CHECK_TYPE_NONCONST(var) { \
void *non_const = 0 ? (var) : NULL; \
(void)non_const; \
} (void)0
#define SWAP(type, a, b) { \ #define SWAP(type, a, b) { \
type sw_ap; \ type sw_ap; \
CHECK_TYPE(a, type); \ CHECK_TYPE(a, type); \
@@ -414,8 +413,7 @@
/* memcpy, skipping the first part of a struct, /* memcpy, skipping the first part of a struct,
* ensures 'struct_dst' isn't const and that the offset can be computed at compile time */ * ensures 'struct_dst' isn't const and that the offset can be computed at compile time */
#define MEMCPY_STRUCT_OFS(struct_dst, struct_src, member) { \ #define MEMCPY_STRUCT_OFS(struct_dst, struct_src, member) { \
void *_not_const = struct_dst; \ CHECK_TYPE_NONCONST(struct_dst); \
(void)_not_const; \
((void)(struct_dst == struct_src), \ ((void)(struct_dst == struct_src), \
memcpy((char *)(struct_dst) + OFFSETOF_STRUCT(struct_dst, member), \ memcpy((char *)(struct_dst) + OFFSETOF_STRUCT(struct_dst, member), \
(char *)(struct_src) + OFFSETOF_STRUCT(struct_dst, member), \ (char *)(struct_src) + OFFSETOF_STRUCT(struct_dst, member), \