[llvm-branch-commits] [clang] release/21.x: [C] static_assert in a for loop is not an extension (#151955) (PR #151999)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 4 09:53:56 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport cb50d78
Requested by: @<!-- -->AaronBallman
---
Full diff: https://github.com/llvm/llvm-project/pull/151999.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaStmt.cpp (+5-1)
- (modified) clang/test/Sema/for.c (+1-2)
``````````diff
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index f85826aecadf3..f46be75bda20f 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -2287,7 +2287,11 @@ StmtResult Sema::ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
// we can diagnose if we don't see any variable declarations. This
// covers a case like declaring a typedef, function, or structure
// type rather than a variable.
- NonVarSeen = DI;
+ //
+ // Note, _Static_assert is acceptable because it does not declare an
+ // identifier at all, so "for object having" does not apply.
+ if (!isa<StaticAssertDecl>(DI))
+ NonVarSeen = DI;
}
}
// Diagnose if we saw a non-variable declaration but no variable
diff --git a/clang/test/Sema/for.c b/clang/test/Sema/for.c
index e16169aac0c4c..35c4720ef3305 100644
--- a/clang/test/Sema/for.c
+++ b/clang/test/Sema/for.c
@@ -26,6 +26,5 @@ void b11 (void) { for (static _Thread_local struct { int i; } s;s.i;); } /* c11-
#endif
void b12(void) {
- for(_Static_assert(1, "");;) {} /* c11-warning {{non-variable declaration in 'for' loop is a C23 extension}}
- c23-warning {{non-variable declaration in 'for' loop is incompatible with C standards before C23}} */
+ for(_Static_assert(1, "");;) {} /* okay, _Static_assert declares *no* identifiers */
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/151999
More information about the llvm-branch-commits
mailing list