Messages in this thread Patch in this message |  | | | Date | Mon, 04 Jun 2012 06:35:27 -0500 | | From | Daniel Santos <> | | Subject | [PATCH] linux/bug.h: make BUILD_BUG_ON generate compile-time error |
| |
This is pretty straight-forward. __compiletime_error is defined in compiler-gcc4.h with appropriate version checks, so shouldn't break on older compilers. This makes the difference between getting an error at link-time and getting one at compile time. Example:
/home/daniel/proj/kernel/grbtest/grbtest2.c:83:2: error: call to ‘__build_bug_on_failed’ declared with attribute error: BUILD_BUG_ON failed: !__builtin_constant_p(count)
The above points me directly to where I called BUILD_BUG_ON. Note that I'm moving __build_bug_on_failed out of the global scope, just so it can be re-declared with different attributes each time.
Daniel From 3af9a38225e6d074ef6b22e6c99c2503bc581953 Mon Sep 17 00:00:00 2001 From: Daniel Santos <daniel.santos@pobox.com> Date: Mon, 4 Jun 2012 06:13:41 -0500 Subject: linux/bug.h: make BUILD_BUG_ON generate compile-time error
--- include/linux/bug.h | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/linux/bug.h b/include/linux/bug.h index 72961c3..d35d6e9 100644 --- a/include/linux/bug.h +++ b/include/linux/bug.h @@ -48,11 +48,12 @@ struct pt_regs; #ifndef __OPTIMIZE__ #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) #else -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; \ +#define BUILD_BUG_ON(condition) \ + do { \ + extern void __build_bug_on_failed(void) \ + __compiletime_error("BUILD_BUG_ON failed: " #condition);\ + ((void)sizeof(char[1 - 2*!!(condition)])); \ + if (condition) __build_bug_on_failed(); \ } while(0) #endif -- 1.7.3.4
|  |