This patch silences a -Wtypes-limits warning in GENMASK_INPUT_CHECK() which is accountable for 31% of all warnings when compiling with W=2. Indeed, GENMASK_INPUT_CHECK() will generate some warnings at W=2 level if invoked with an unsigned integer and zero. For example, this: | #include <linux/bits.h> | unsigned int foo(unsigned int bar) | { return GENMASK(bar, 0); } would yield 30 lines of warning. Extract: | In file included from ./include/linux/bits.h:22, | from ./foo.c:1: | foo.c: In function 'foo': | ./include/linux/bits.h:25:36: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits] | 25 | __is_constexpr((l) > (h)), (l) > (h), 0))) | | ^ This pattern is harmless (false positive) and for that reason, -Wtypes-limits was moved to W=2. c.f. [1]. However because it occurs in header files (example: find_first_bit() from linux/find.h [2]), GENMASK_INPUT_CHECK() is accountable for roughly 31% (164714/532484) of all W=2 warnings for an allyesconfig. This is an issue because that noise makes it harder to triage and find relevant W=2 warnings. Reference (using gcc 11.2, linux v5.17-rc6 on x86_64): | $ make allyesconfig | $ sed -i '/CONFIG_WERROR/d' .config | $ make W=2 -j8 2> kernel_w2.log > /dev/null | $ grep "\./include/linux/bits\.h:.*: warning" kernel_w2\.log | wc -l | 164714 | $ grep ": warning: " kernel_w2.log | wc -l | 532484 In this patch, we silence this warning by: * replacing the comparison > by and logical and && in the first argument of __builtin_choose_expr(). * casting the high bit of the mask to a signed integer in the second argument of __builtin_choose_expr(). [1] https://lore.kernel.org/lkml/20200708190756.16810-1-rikard.falkeborn@xxxxxxxxx/ [2] https://elixir.bootlin.com/linux/v5.17-rc6/source/include/linux/find.h#L119 Link: https://lore.kernel.org/lkml/cover.1590017578.git.syednwaris@xxxxxxxxx/ Link: https://lore.kernel.org/lkml/20220304124416.1181029-1-mailhol.vincent@xxxxxxxxxx/ Fixes: 295bcca84916 ("linux/bits.h: add compile time sanity check of GENMASK inputs") Signed-off-by: Vincent Mailhol <mailhol.vincent@xxxxxxxxxx> --- * Changelog * v1 -> v2: * Rewrote the commit message to make it less verbose * Add in CC all people from: https://lore.kernel.org/lkml/cover.1590017578.git.syednwaris@xxxxxxxxx/ --- include/linux/bits.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/bits.h b/include/linux/bits.h index 87d112650dfb..542e9a8985b1 100644 --- a/include/linux/bits.h +++ b/include/linux/bits.h @@ -22,7 +22,7 @@ #include <linux/build_bug.h> #define GENMASK_INPUT_CHECK(h, l) \ (BUILD_BUG_ON_ZERO(__builtin_choose_expr( \ - __is_constexpr((l) > (h)), (l) > (h), 0))) + __is_constexpr((h)) && __is_constexpr((l)), (l) > (int)(h), 0))) #else /* * BUILD_BUG_ON_ZERO is not available in h files included from asm files, -- 2.34.1