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
