Skip to content

-Wdeclaration-after-statement in lib/raid6/ with proposed -std=gnu11 #1603

@nathanchance

Description

@nathanchance
Member

Linus is proposing switching to -std=gnu11. In my tests, I found this introduced a warning with an arm64 big endian defconfig:

$ git diff HEAD
diff --git a/Makefile b/Makefile
index 289ce2be8032..e8d600be95a4 100644
--- a/Makefile
+++ b/Makefile
@@ -515,7 +515,7 @@ KBUILD_CFLAGS   := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
                   -Werror=implicit-function-declaration -Werror=implicit-int \
                   -Werror=return-type -Wno-format-security \
-                  -std=gnu89
+                  -std=gnu11 -Wno-shift-count-negative
 KBUILD_CPPFLAGS := -D__KERNEL__
 KBUILD_AFLAGS_KERNEL :=
 KBUILD_CFLAGS_KERNEL :=

$ make -skj"$(nproc)" ARCH=arm64 LLVM=1 mrproper defconfig

$ scripts/config -d CPU_LITTLE_ENDIAN -e CPU_BIG_ENDIAN

$ make -skj"$(nproc)" ARCH=arm64 LLVM=1 olddefconfig lib/raid6/
lib/raid6/recov_neon_inner.c:55:8: warning: mixing declarations and code is incompatible with standards before C99 [-Wdeclaration-after-statement]
                vy = vshrq_n_u8(vx, 4);
                     ^
/home/nathan/cbl/toolchains/stow/llvm/2022-02-23_16-14-30-18fa0b15ccf610f34af1231440f89d20cb99e7a0/lib/clang/15.0.0/include/arm_neon.h:25231:14: note: expanded from macro 'vshrq_n_u8'
  uint8x16_t __ret; \
             ^
lib/raid6/recov_neon_inner.c:60:8: warning: mixing declarations and code is incompatible with standards before C99 [-Wdeclaration-after-statement]
                vy = vshrq_n_u8(px, 4);
                     ^
/home/nathan/cbl/toolchains/stow/llvm/2022-02-23_16-14-30-18fa0b15ccf610f34af1231440f89d20cb99e7a0/lib/clang/15.0.0/include/arm_neon.h:25231:14: note: expanded from macro 'vshrq_n_u8'
  uint8x16_t __ret; \
             ^
lib/raid6/recov_neon_inner.c:96:8: warning: mixing declarations and code is incompatible with standards before C99 [-Wdeclaration-after-statement]
                vy = vshrq_n_u8(vx, 4);
                     ^
/home/nathan/cbl/toolchains/stow/llvm/2022-02-23_16-14-30-18fa0b15ccf610f34af1231440f89d20cb99e7a0/lib/clang/15.0.0/include/arm_neon.h:25231:14: note: expanded from macro 'vshrq_n_u8'
  uint8x16_t __ret; \
             ^
3 warnings generated.
...

Looking at arm_neon.h:

#ifdef __LITTLE_ENDIAN__
#define vshrq_n_u8(__p0, __p1) __extension__ ({ \
  uint8x16_t __s0 = __p0; \
  uint8x16_t __ret; \
  __ret = (uint8x16_t) __builtin_neon_vshrq_n_v((int8x16_t)__s0, __p1, 48); \
  __ret; \
})
#else
#define vshrq_n_u8(__p0, __p1) __extension__ ({ \
  uint8x16_t __s0 = __p0; \
  uint8x16_t __rev0;  __rev0 = __builtin_shufflevector(__s0, __s0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); \
  uint8x16_t __ret; \
  __ret = (uint8x16_t) __builtin_neon_vshrq_n_v((int8x16_t)__rev0, __p1, 48); \
  __ret = __builtin_shufflevector(__ret, __ret, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); \
  __ret; \
})
#endif

It looks like this file is automatically generated, so I am not sure how to make __rev0 appear after __ret.

cc @DavidSpickett for thoughts, as you have helped with ARM LLVM problems before.

Activity

arndb

arndb commented on Feb 25, 2022

@arndb

I think part of the issue here is that <arm_neon.h> is a system header, which has more relaxed rules for warnings, so we intentionally don't get a warning with "-std=gnu89 -Wdeclaration-after-statement -Wno-gnu" despite the code being in standard c89 without GNU extensions.

It appears that with "-std=gnu11 -Wdeclaration-after-statement", clang incorrectly warns about it even in system headers as this is correct behavior in both c11 and gnu11, but we ask for a warning anyway.

nathanchance

nathanchance commented on Feb 25, 2022

@nathanchance
MemberAuthor

Right. I can see in Sema::ActOnCompoundStmt() that there is a check for the diagnostic being ignored (!Diags.isIgnored(MixedDeclsCodeID, L)), which calls DiagnosticIDs::getDiagnosticSeverity(), which does check if the source location is in a system macro; maybe something about that flow is messed up?

nathanchance

nathanchance commented on Feb 25, 2022

@nathanchance
MemberAuthor

I've filed an upstream LLVM bug: llvm/llvm-project#54062

MarcusJohnson91

MarcusJohnson91 commented on Feb 28, 2022

@MarcusJohnson91

Why C11? C18 is exactly the same, with just one unused macro that was introduced in C11 removed.

arndb

arndb commented on Feb 28, 2022

@arndb

C11 is the newest standard that the oldest supported compiler (gcc-5.1) already understands. I think we can probably just do away with explicitly picking a -std= option and go with the compiler's default, which should be gnu11 or higher for all supported versions of gcc or clang.

added
[BUG] llvmA bug that should be fixed in upstream LLVM
and removed on Mar 1, 2022
added a commit that references this issue on Mar 2, 2022
added a commit that references this issue on Mar 8, 2022
added a commit that references this issue on Mar 10, 2022

491 remaining items

added 2 commits that reference this issue on May 17, 2025
added a commit that references this issue on May 21, 2025
added a commit that references this issue on May 21, 2025
added 2 commits that reference this issue on Jun 8, 2025
added a commit that references this issue on Jun 22, 2025
added a commit that references this issue on Aug 5, 2025
added a commit that references this issue on Aug 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @arndb@nickdesaulniers@MarcusJohnson91@nathanchance

      Issue actions

        -Wdeclaration-after-statement in lib/raid6/ with proposed -std=gnu11 · Issue #1603 · ClangBuiltLinux/linux