On Fri, Jan 8, 2021 at 12:34 PM Arnd Bergmann <arnd@xxxxxxxxxx> wrote: > > On Fri, Jan 8, 2021 at 9:02 PM Linus Torvalds > <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > On Fri, Jan 8, 2021 at 1:27 AM Will Deacon <will@xxxxxxxxxx> wrote: > > > > > > On Fri, Jan 08, 2021 at 10:21:54AM +0100, Peter Zijlstra wrote: > > > > On Thu, Jan 07, 2021 at 10:20:38PM +0100, Arnd Bergmann wrote: > > > > > On Thu, Jan 7, 2021 at 2:37 PM Russell King - ARM Linux admin > > > > I appreciate Arnd pointing out "--std=gnu11", though. What are the > > actual relevant language improvements? It's hard to say, since a lot of new language features were already GNU C extensions. The only semantic difference I'm aware of is the semantics of `extern inline` changed 100% from c89 to c99 (so jumping from gnu89 to gnu11 would change that). We already #define inline to __attribute__((__gnu_inline)) (there's also a -fgnu-inline flag), but I worry for places that don't include that header or drop KBUILD_CFLAGS (like every vdso), though `extern inline` is awful (and I should be put in jail for introducing it to the kernel; now we have __attribute__((no_stack_protector)) in both toolchains, and should be using that instead, but we don't have it yet for all supported compiler versions). A quick grep through clang's sources shows mostly parser changes for _Noreturn, _Alignof and friends etc.. New to me are unicode literal strings (u or U suffix or prefix?) and something about loops expected to make forward progress??? Another thing I've been worried about is Makefiles that reset KBUILD_CFLAGS, since that's a constant source of pain/breakage for cross compiling from Clang. That tends to drop -std=gnu89. For instance: $ make LLVM=1 -j71 defconfig $ make LLVM=1 -j71 V=1 &>log.txt $ grep -v std=gnu89 log.txt | grep clang | rev | cut -d ' ' -f 1 | rev | grep -v \\.S arch/x86/realmode/rm/wakemain.c arch/x86/realmode/rm/video-mode.c arch/x86/realmode/rm/regs.c arch/x86/realmode/rm/video-vga.c arch/x86/realmode/rm/video-vesa.c arch/x86/realmode/rm/video-bios.c drivers/firmware/efi/libstub/efi-stub-helper.c drivers/firmware/efi/libstub/gop.c drivers/firmware/efi/libstub/secureboot.c drivers/firmware/efi/libstub/tpm.c drivers/firmware/efi/libstub/file.c drivers/firmware/efi/libstub/mem.c drivers/firmware/efi/libstub/random.c drivers/firmware/efi/libstub/randomalloc.c drivers/firmware/efi/libstub/pci.c drivers/firmware/efi/libstub/skip_spaces.c lib/cmdline.c lib/ctype.c drivers/firmware/efi/libstub/alignedmem.c drivers/firmware/efi/libstub/relocate.c drivers/firmware/efi/libstub/vsprintf.c drivers/firmware/efi/libstub/x86-stub.c arch/x86/boot/a20.c arch/x86/boot/cmdline.c arch/x86/boot/cpuflags.c arch/x86/boot/cpucheck.c arch/x86/boot/early_serial_console.c arch/x86/boot/edd.c arch/x86/boot/main.c arch/x86/boot/memory.c arch/x86/boot/pm.c arch/x86/boot/printf.c arch/x86/boot/regs.c arch/x86/boot/string.c arch/x86/boot/tty.c arch/x86/boot/video.c arch/x86/boot/video-mode.c arch/x86/boot/version.c arch/x86/boot/video-vga.c arch/x86/boot/video-vesa.c arch/x86/boot/video-bios.c arch/x86/boot/cpu.c arch/x86/boot/compressed/string.c arch/x86/boot/compressed/cmdline.c arch/x86/boot/compressed/error.c arch/x86/boot/compressed/cpuflags.c arch/x86/boot/compressed/early_serial_console.c arch/x86/boot/compressed/kaslr.c arch/x86/boot/compressed/ident_map_64.c arch/x86/boot/compressed/idt_64.c arch/x86/boot/compressed/pgtable_64.c arch/x86/boot/compressed/acpi.c arch/x86/boot/compressed/misc.c So it looks like parts of the tree are already built with -std=gnu11 or -std=gnu17, as they rely on the implicit default C language mode when unspecified. Oops? -- Thanks, ~Nick Desaulniers