diff options
authorVegard Nossum <>2020-04-06 20:09:37 -0700
committerGreg Kroah-Hartman <>2020-04-24 07:59:13 +0200
commit8feaf69773e0953dfe956ddae46610b97ea39b1d (patch)
parent9729be90f7b18d9ef191039dae34e232e220429c (diff)
compiler.h: fix error in BUILD_BUG_ON() reporting
[ Upstream commit af9c5d2e3b355854ff0e4acfbfbfadcd5198a349 ] compiletime_assert() uses __LINE__ to create a unique function name. This means that if you have more than one BUILD_BUG_ON() in the same source line (which can happen if they appear e.g. in a macro), then the error message from the compiler might output the wrong condition. For this source file: #include <linux/build_bug.h> #define macro() \ BUILD_BUG_ON(1); \ BUILD_BUG_ON(0); void foo() { macro(); } gcc would output: ./include/linux/compiler.h:350:38: error: call to `__compiletime_assert_9' declared with attribute error: BUILD_BUG_ON failed: 0 _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) However, it was not the BUILD_BUG_ON(0) that failed, so it should say 1 instead of 0. With this patch, we use __COUNTER__ instead of __LINE__, so each BUILD_BUG_ON() gets a different function name and the correct condition is printed: ./include/linux/compiler.h:350:38: error: call to `__compiletime_assert_0' declared with attribute error: BUILD_BUG_ON failed: 1 _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) Signed-off-by: Vegard Nossum <> Signed-off-by: Andrew Morton <> Reviewed-by: Masahiro Yamada <> Reviewed-by: Daniel Santos <> Cc: Rasmus Villemoes <> Cc: Ian Abbott <> Cc: Joe Perches <> Link: Signed-off-by: Linus Torvalds <> Signed-off-by: Sasha Levin <>
1 files changed, 1 insertions, 1 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 0020ee1cab37..7837afabbd78 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -546,7 +546,7 @@ unsigned long read_word_at_a_time(const void *addr)
* compiler has support to do so.
#define compiletime_assert(condition, msg) \
- _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
+ _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
#define compiletime_assert_atomic_type(t) \
compiletime_assert(__native_word(t), \