[clang] [clang] Clean up switch stack when transforming an invalid body (PR #211162)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 2 19:29:20 PDT 2026
https://github.com/woruyu updated https://github.com/llvm/llvm-project/pull/211162
>From 16b23bf3c3ba526c720a0ab2a9fe63ae30864780 Mon Sep 17 00:00:00 2001
From: woruyu <1214539920 at qq.com>
Date: Wed, 22 Jul 2026 10:38:19 +0800
Subject: [PATCH 1/4] [clang] Clean up switch stack when transforming an
invalid body
---
clang/lib/Sema/TreeTransform.h | 4 +++-
.../SemaCXX/cxx2c-expansion-stmts-control-flow.cpp | 10 ++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index f1a3493ce9ea3..8679bb29b3459 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -8619,8 +8619,10 @@ TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
// Transform the body of the switch statement.
StmtResult Body = getDerived().TransformStmt(S->getBody());
+ // Finish the switch even on error to pop it from Sema's switch stack.
if (Body.isInvalid())
- return StmtError();
+ return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
+ nullptr);
// Complete the switch statement.
return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
diff --git a/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp b/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
index 51b383d63cdcb..3645fbff9a289 100644
--- a/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
+++ b/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
@@ -116,6 +116,16 @@ void case_default(int i) {
}
}
+void gh210575(int i) {
+ switch (i) {
+ template for (auto x : {1, 2}) {
+ switch (i) {
+ bar baz(); // expected-error {{unknown type name 'bar'}}
+ }
+ }
+ }
+}
+
void case_constexpr(int i) {
template for (constexpr auto x : {1, 2, 3}) { // expected-note {{in instantiation of expansion statement requested here}}
switch (i) {
>From f7027e6571e5bb35cd8bb52c94b5121cbd6b36c2 Mon Sep 17 00:00:00 2001
From: woruyu <1214539920 at qq.com>
Date: Wed, 2 Sep 2026 17:19:01 +0800
Subject: [PATCH 2/4] fix: review
---
clang/lib/Sema/TreeTransform.h | 4 ----
1 file changed, 4 deletions(-)
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 8679bb29b3459..ff66f1ae8c402 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -8619,10 +8619,6 @@ TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
// Transform the body of the switch statement.
StmtResult Body = getDerived().TransformStmt(S->getBody());
- // Finish the switch even on error to pop it from Sema's switch stack.
- if (Body.isInvalid())
- return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
- nullptr);
// Complete the switch statement.
return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
>From a710107eadbdeaa5488ed0880ff98e98c9a19a9d Mon Sep 17 00:00:00 2001
From: woruyu <1214539920 at qq.com>
Date: Wed, 2 Sep 2026 17:21:53 +0800
Subject: [PATCH 3/4] rename testcase func name
---
clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp b/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
index 3645fbff9a289..eddfb3182c521 100644
--- a/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
+++ b/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
@@ -116,7 +116,7 @@ void case_default(int i) {
}
}
-void gh210575(int i) {
+void PR211162(int i) {
switch (i) {
template for (auto x : {1, 2}) {
switch (i) {
>From a7cee430c681e9bef90ff13a564084f0b1873b97 Mon Sep 17 00:00:00 2001
From: woruyu <1214539920 at qq.com>
Date: Thu, 3 Sep 2026 10:25:59 +0800
Subject: [PATCH 4/4] fix: review
---
clang/docs/ReleaseNotes.md | 3 +++
clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 492f13dafa297..a488d1c84923e 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -567,6 +567,9 @@ features cannot lower the translation-unit ABI level;
- Fixed an assertion when instantiating the body of a C++26 expansion
statement after a fatal error had occurred. (#GH214917)
+- Fixed an assertion when an invalid statement appeared in a ``switch``
+ statement nested inside a C++26 expansion statement. (#GH210575)
+
- Fixed friend declarations sometimes making non-visible default arguments
incorrectly visible to default argument redefinition checks across modules.
diff --git a/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp b/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
index eddfb3182c521..1001abae5f6ef 100644
--- a/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
+++ b/clang/test/SemaCXX/cxx2c-expansion-stmts-control-flow.cpp
@@ -116,7 +116,7 @@ void case_default(int i) {
}
}
-void PR211162(int i) {
+void GH210575(int i) {
switch (i) {
template for (auto x : {1, 2}) {
switch (i) {
More information about the cfe-commits
mailing list