https://github.com/woruyu updated 
https://github.com/llvm/llvm-project/pull/211162

>From 16b23bf3c3ba526c720a0ab2a9fe63ae30864780 Mon Sep 17 00:00:00 2001
From: woruyu <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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) {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to