On Mon, Feb 28, 2022 at 2:32 AM Arnd Bergmann arnd@kernel.org wrote:
From: Arnd Bergmann arnd@arndb.de
During a patch discussion, Linus brought up the option of changing the C standard version from gnu89 to gnu99, which allows using variable declaration inside of a for() loop. While the C99, C11 and later standards introduce many other features, most of these are already available in gnu89 as GNU extensions as well.
An earlier attempt to do this when gcc-5 started defaulting to -std=gnu11 failed because at the time that caused warnings about designated initializers with older compilers. Now that gcc-5.1 is the minimum compiler version used for building kernels, that is no longer a concern. Similarly, the behavior of 'inline' functions changes between
More precisely, the semantics of "extern inline" functions changed between ISO C90 and ISO C99.
That's the only concern I have, which I doubt is an issue. The kernel is already covered by the function attribute as you note.
Just to have some measure: $ git grep -rn "extern inline" | wc -l 116
Most of those are in arch/alpha/ which is curious; I wonder if those were intentional.
(I do worry about Makefiles that completely reset KBUILD_CFLAGS though; the function attributes still take precedence).
gnu89 and gnu11, but this was taken care of by defining 'inline' to include __attribute__((gnu_inline)) in order to allow building with clang a while ago.
One minor issue that remains is an added gcc warning for shifts of negative integers when building with -Werror, which happens with the 'make W=1' option, as well as for three drivers in the kernel that always enable -Werror, but it was only observed with the i915 driver so far. To be on the safe side, add -Wno-shift-negative-value to any -Wextra in a Makefile.
Nathan Chancellor reported an additional -Wdeclaration-after-statement warning that appears in a system header on arm, this still needs a workaround.
Ack; I think we can just fix this in clang.
The differences between gnu99, gnu11, gnu1x and gnu17 are fairly minimal and mainly impact warnings at the -Wpedantic level that the kernel never enables. Between these, gnu11 is the newest version that is supported by all supported compiler versions, though it is only the default on gcc-5, while all other supported versions of gcc or clang default to gnu1x/gnu17.
I agree. With the fixup to s/Werror/Wextra.
Reviewed-by: Nick Desaulniers ndesaulniers@google.com
Link: https://lore.kernel.org/lkml/CAHk-=wiyCH7xeHcmiFJ-YgXUy2Jaj7pnkdKpcovt8fYbVF... Link: https://github.com/ClangBuiltLinux/linux/issues/1603 Suggested-by: Linus Torvalds torvalds@linux-foundation.org Cc: Masahiro Yamada masahiroy@kernel.org Cc: linux-kbuild@vger.kernel.org Cc: llvm@lists.linux.dev Signed-off-by: Arnd Bergmann arnd@arndb.de