bug.h: prevent double evaulation of `condition' in BUILD_BUG_ON
authorDaniel Santos <daniel.santos@pobox.com>
Fri, 22 Feb 2013 00:41:45 +0000 (16:41 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Feb 2013 01:22:16 +0000 (17:22 -0800)
When calling BUILD_BUG_ON in an optimized build using gcc 4.3 and later,
the condition will be evaulated twice, possibily with side-effects.  This
patch eliminates that error.

[akpm@linux-foundation.org: tweak code layout]
Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: David Rientjes <rientjes@google.com>
Cc: Joe Perches <joe@perches.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/bug.h

index 27d404f91b3e990a71ad41551669d8bcea8ed3f1..89fb91d0c929d4cc74c8c4971d6f0f67fdd7651d 100644 (file)
@@ -59,9 +59,10 @@ struct pt_regs;
 extern int __build_bug_on_failed;
 #define BUILD_BUG_ON(condition)                                        \
        do {                                                    \
-               ((void)sizeof(char[1 - 2*!!(condition)]));      \
-               if (condition) __build_bug_on_failed = 1;       \
-       } while(0)
+               bool __cond = !!(condition);                    \
+               ((void)sizeof(char[1 - 2 * __cond]));           \
+               if (__cond) __build_bug_on_failed = 1;          \
+       } while (0)
 #endif
 
 /**