https://github.com/efriedma-quic created https://github.com/llvm/llvm-project/pull/142648
Backport 97885213bd4507b204b050c3cd570e365d21cc7d >From c40a997d92a6939e3fb75c6a8766c851c57f3c58 Mon Sep 17 00:00:00 2001 From: Eli Friedman <efrie...@quicinc.com> Date: Tue, 3 Jun 2025 09:51:37 -0700 Subject: [PATCH] release/20.x: [clang] Don't evaluate the initializer of constexpr-unknown parameters. (#142498) Backport 97885213bd4507b204b050c3cd570e365d21cc7d --- clang/lib/AST/ExprConstant.cpp | 7 ++++++- clang/test/SemaCXX/constant-expression-p2280r4.cpp | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index e0746f4532245..209b269122a8e 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -3525,7 +3525,12 @@ static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, // should begin within the evaluation of E // Used to be C++20 [expr.const]p5.12.2: // ... its lifetime began within the evaluation of E; - if (isa<ParmVarDecl>(VD) && !AllowConstexprUnknown) { + if (isa<ParmVarDecl>(VD)) { + if (AllowConstexprUnknown) { + Result = &Info.CurrentCall->createConstexprUnknownAPValues(VD, Base); + return true; + } + // Assume parameters of a potential constant expression are usable in // constant expressions. if (!Info.checkingPotentialConstantExpression() || diff --git a/clang/test/SemaCXX/constant-expression-p2280r4.cpp b/clang/test/SemaCXX/constant-expression-p2280r4.cpp index 87beeb4d3dc84..dbaebb81b93e8 100644 --- a/clang/test/SemaCXX/constant-expression-p2280r4.cpp +++ b/clang/test/SemaCXX/constant-expression-p2280r4.cpp @@ -200,3 +200,15 @@ int f() { return !get_value<Dummy>(); // contextually convert the function call result to bool } } + +namespace param_reference { + constexpr int arbitrary = -12345; + constexpr void f(const int &x = arbitrary) { // expected-note {{declared here}} + constexpr const int &v1 = x; // expected-error {{must be initialized by a constant expression}} \ + // expected-note {{reference to 'x' is not a constant expression}} + constexpr const int &v2 = (x, arbitrary); // expected-warning {{left operand of comma operator has no effect}} + constexpr int v3 = x; // expected-error {{must be initialized by a constant expression}} + static_assert(x==arbitrary); // expected-error {{static assertion expression is not an integral constant expression}} + static_assert(&x - &x == 0); + } +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits