Thanks for the patch!
(Was always wondering which of binutils and kernel would migrate to C99+
earlier... binutils won)
On 2022-02-28, Nick Desaulniers wrote:
On Mon, Feb 28, 2022 at 2:32 AM Arnd Bergmann <arnd@xxxxxxxxxx> wrote:
From: Arnd Bergmann <arnd@xxxxxxxx>
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.
Perhaps a clearer explanation to readers is: "extern inline" and "inline" swap
semantics with gnu_inline (-fgnu89-inline or __attribute__((__gnu_inline__))).
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
"^inline" behaves like C99+ "extern inline"
Agree this is handled by
#define inline inline __gnu_inline __inline_maybe_unused notrace
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@xxxxxxxxxx>
Link: https://lore.kernel.org/lkml/CAHk-=wiyCH7xeHcmiFJ-YgXUy2Jaj7pnkdKpcovt8fYbVFW3TA@xxxxxxxxxxxxxx/
Link: https://github.com/ClangBuiltLinux/linux/issues/1603
Suggested-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Cc: Masahiro Yamada <masahiroy@xxxxxxxxxx>
Cc: linux-kbuild@xxxxxxxxxxxxxxx
Cc: llvm@xxxxxxxxxxxxxxx
Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
--
Thanks,
~Nick Desaulniers