https://github.com/tbaederr created 
https://github.com/llvm/llvm-project/pull/166533

By rejecting them.

Fixes https://github.com/llvm/llvm-project/issues/165555

>From 52472799179c8ad47cca6a76f5d7e8e01058e10f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]>
Date: Wed, 5 Nov 2025 12:10:56 +0100
Subject: [PATCH] [clang][ExprConst] Handle depdenent switch case statements

By rejecting them.

Fixes https://github.com/llvm/llvm-project/issues/165555
---
 clang/lib/AST/ByteCode/Compiler.cpp          |  2 ++
 clang/lib/AST/ExprConstant.cpp               | 11 +++++++----
 clang/test/SemaCXX/dependent-switch-case.cpp |  6 ++++++
 3 files changed, 15 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/SemaCXX/dependent-switch-case.cpp

diff --git a/clang/lib/AST/ByteCode/Compiler.cpp 
b/clang/lib/AST/ByteCode/Compiler.cpp
index 6c088469a3ca2..bf952d73a0af5 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -5989,6 +5989,8 @@ bool Compiler<Emitter>::visitSwitchStmt(const SwitchStmt 
*S) {
       CaseLabels[SC] = this->getLabel();
 
       const Expr *Value = CS->getLHS();
+      if (Value->isValueDependent())
+        return false;
       PrimType ValueT = this->classifyPrim(Value->getType());
 
       // Compare the case statement's value to the switch condition.
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 97eeba8b9d6cc..b33731643c1c4 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -5452,10 +5452,13 @@ static EvalStmtResult EvaluateSwitch(StmtResult 
&Result, EvalInfo &Info,
     }
 
     const CaseStmt *CS = cast<CaseStmt>(SC);
-    APSInt LHS = CS->getLHS()->EvaluateKnownConstInt(Info.Ctx);
-    APSInt RHS = CS->getRHS() ? CS->getRHS()->EvaluateKnownConstInt(Info.Ctx)
-                              : LHS;
-    if (LHS <= Value && Value <= RHS) {
+    const Expr *LHS = CS->getLHS();
+    const Expr *RHS = CS->getRHS();
+    if (LHS->isValueDependent() || (RHS && RHS->isValueDependent()))
+      return ESR_Failed;
+    APSInt LHSValue = LHS->EvaluateKnownConstInt(Info.Ctx);
+    APSInt RHSValue = RHS ? RHS->EvaluateKnownConstInt(Info.Ctx) : LHSValue;
+    if (LHSValue <= Value && Value <= RHSValue) {
       Found = SC;
       break;
     }
diff --git a/clang/test/SemaCXX/dependent-switch-case.cpp 
b/clang/test/SemaCXX/dependent-switch-case.cpp
new file mode 100644
index 0000000000000..bbeab3a650f4d
--- /dev/null
+++ b/clang/test/SemaCXX/dependent-switch-case.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -std=c++20 %s -verify
+// RUN: %clang_cc1 -std=c++20 %s -verify 
-fexperimental-new-constant-interpreter
+
+constexpr bool e(int){switch(0)0=0:return t(;} // expected-error {{expression 
is not assignable}} \
+                                               // expected-error {{expected 
'case' keyword before expression}} \
+                                               // expected-error {{expected 
expression}}

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

Reply via email to