Macros: prevent instantiation of args for type checks
authorCampbell Barton <ideasman42@gmail.com>
Mon, 4 Aug 2014 01:14:20 +0000 (11:14 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 4 Aug 2014 01:18:33 +0000 (11:18 +1000)
also make CHECK_TYPE_INLINE more strict

source/blender/blenlib/BLI_stackdefines.h
source/blender/blenlib/BLI_utildefines.h
source/blender/makesdna/DNA_ID.h

index 24cb043cd4376fadd9833aa956a11b63c1e6653e..da9bf5ea04c0ce2f5587cacb411baa5b39005863 100644 (file)
@@ -36,7 +36,7 @@
 #  define _STACK_SWAP_TOTALLOC(stack_a, stack_b) SWAP(unsigned int, _##stack_a##_totalloc, _##stack_b##_totalloc)
 #else
 #  define STACK_DECLARE(stack)   unsigned int _##stack##_index
-#  define STACK_INIT(stack, tot) ((void)stack, (void)((_##stack##_index) = 0), (void)(tot))
+#  define STACK_INIT(stack, tot) ((void)stack, (void)((_##stack##_index) = 0), (void)(0 ? tot : 0))
 #  define _STACK_SIZETEST(stack, off) (void)(stack), (void)(off)
 #  define _STACK_SWAP_TOTALLOC(stack_a, stack_b) (void)(stack_a), (void)(stack_b)
 #endif
 #define STACK_PEEK_PTR(stack)       (BLI_assert(_##stack##_index), &((stack)[_##stack##_index - 1]))
 /** remove any item from the stack, take care, re-orders */
 #define STACK_REMOVE(stack, i) \
-       _STACK_BOUNDSTEST(stack, i); \
-       if (--_##stack##_index != i) { \
-               stack[i] = stack[_##stack##_index]; \
+       { \
+               const unsigned int _i = i; \
+               _STACK_BOUNDSTEST(stack, _i); \
+               if (--_##stack##_index != _i) { \
+                       stack[_i] = stack[_##stack##_index]; \
+               } \
        } (void)0
 #ifdef __GNUC__
 #define STACK_SWAP(stack_a, stack_b) { \
index fcc7ac34a9ec151730218c567e6f34b3d237d2e7..1f34156a04ef5b7a8427737e4f0cdb34b5e5319a 100644 (file)
@@ -59,7 +59,6 @@
 #define VA_NARGS_CALL_OVERLOAD(name, ...) \
        _VA_NARGS_GLUE(_VA_NARGS_OVERLOAD_MACRO(name, _VA_NARGS_COUNT_MAX16(__VA_ARGS__)), (__VA_ARGS__))
 
-
 /* useful for finding bad use of min/max */
 #if 0
 /* gcc only */
 #endif
 
 /* can be used in simple macros */
-#define CHECK_TYPE_INLINE(val, type) \
-       ((void)(((type)0) != (val)))
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
+#  define CHECK_TYPE_INLINE(val, type) \
+       (void)((void)(((type)0) != (0 ? (val) : ((type)0))), \
+              _Generic((val), type: 0, const type: 0))
+#else
+#  define CHECK_TYPE_INLINE(val, type) \
+       ((void)(((type)0) != (0 ? (val) : ((type)0))))
+#endif
 
 #define CHECK_TYPE_NONCONST(var)  {      \
        void *non_const = 0 ? (var) : NULL;  \
index cb6d17ab6c7d24fcd301f9f8ea6fca0d7d6b6d9d..1ba24f5d7d48e957f30f5ce9870ca364fcd07540 100644 (file)
@@ -237,7 +237,7 @@ typedef struct PreviewImage {
 #  undef GS
 #endif
 // #define GS(a)       (*((short *)(a)))
-#define GS(a)  (CHECK_TYPE_INLINE(a, const char *), (*((short *)(a))))
+#define GS(a)  (CHECK_TYPE_INLINE(a, char *), (*((short *)(a))))
 
 #define ID_NEW(a)              if (      (a) && (a)->id.newid ) (a) = (void *)(a)->id.newid
 #define ID_NEW_US(a)   if (      (a)->id.newid)       { (a) = (void *)(a)->id.newid;       (a)->id.us++; }