Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kbuild: Do not enable -Wimplicit-fallthrough for clang for now

This functionally reverts commit bfd77145f35c ("Makefile: Convert
-Wimplicit-fallthrough=3 to just -Wimplicit-fallthrough for clang").

clang enabled support for -Wimplicit-fallthrough in C in r369414 [1],
which causes a lot of warnings when building the kernel for two reasons:

1. Clang does not support the /* fall through */ comments. There seems
to be a general consensus in the LLVM community that this is not
something they want to support. Joe Perches wrote a script to convert
all of the comments to a "fallthrough" keyword that will be added to
compiler_attributes.h [2] [3], which catches the vast majority of the
comments. There doesn't appear to be any consensus in the kernel
community when to do this conversion.

2. Clang and GCC disagree about falling through to final case statements
with no content or cases that simply break:

https://godbolt.org/z/c8csDu

This difference contributes at least 50 warnings in an allyesconfig
build for x86, not considering other architectures. This difference
will need to be discussed to see which compiler is right [4] [5].

[1]: https://github.com/llvm/llvm-project/commit/1e0affb6e564b7361b0aadb38805f26deff4ecfc
[2]: https://lore.kernel.org/lkml/61ddbb86d5e68a15e24ccb06d9b399bbf5ce2da7.camel@perches.com/
[3]: https://lore.kernel.org/lkml/1d2830aadbe9d8151728a7df5b88528fc72a0095.1564549413.git.joe@perches.com/
[4]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91432
[5]: https://github.com/ClangBuiltLinux/linux/issues/636

Given these two problems need discussion and coordination, do not enable
-Wimplicit-fallthrough with clang right now. Add a comment to explain
what is going on as well. This commit should be reverted once these two
issues are fully flushed out and resolved.

Suggested-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
Acked-by: Nick Desaulniers <ndesaulniers@google.com>
Acked-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

authored by

Nathan Chancellor and committed by
Masahiro Yamada
e2079e93 4ca76945

+5 -3
+5 -3
Makefile
··· 774 774 # These warnings generated too much noise in a regular build. 775 775 # Use make W=1 to enable them (see scripts/Makefile.extrawarn) 776 776 KBUILD_CFLAGS += -Wno-unused-but-set-variable 777 + 778 + # Warn about unmarked fall-throughs in switch statement. 779 + # Disabled for clang while comment to attribute conversion happens and 780 + # https://github.com/ClangBuiltLinux/linux/issues/636 is discussed. 781 + KBUILD_CFLAGS += $(call cc-option,-Wimplicit-fallthrough,) 777 782 endif 778 783 779 784 KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable) ··· 872 867 873 868 # warn about C99 declaration after statement 874 869 KBUILD_CFLAGS += -Wdeclaration-after-statement 875 - 876 - # Warn about unmarked fall-throughs in switch statement. 877 - KBUILD_CFLAGS += $(call cc-option,-Wimplicit-fallthrough,) 878 870 879 871 # Variable Length Arrays (VLAs) should not be used anywhere in the kernel 880 872 KBUILD_CFLAGS += -Wvla