-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang] Don't evaluate the initializer of constexpr-unknown parameters. #142498
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
If we see a parameter of reference type that isn't part of the frame, don't try to evaluate its defualt argument. Just treat it as a constexpr-unknown value. Fixes llvm#141114. Fixes llvm#141858.
@llvm/pr-subscribers-clang Author: Eli Friedman (efriedma-quic) ChangesIf we see a parameter of reference type that isn't part of the frame, don't try to evaluate its default argument. Just treat it as a constexpr-unknown value. Fixes #141114. Fixes #141858. Full diff: https://github.com/llvm/llvm-project/pull/142498.diff 2 Files Affected:
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index b20e2690d0eee..ab964e592de80 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -3550,7 +3550,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 c14250a268f6c..50637917ba210 100644
--- a/clang/test/SemaCXX/constant-expression-p2280r4.cpp
+++ b/clang/test/SemaCXX/constant-expression-p2280r4.cpp
@@ -250,3 +250,15 @@ namespace uninit_reference_used {
// expected-note {{in call to 'g5()'}}
}
+
+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);
+ }
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was literally just writing this PR and saw you just submitted this one, thank you!
LGTM
/cherry-pick 9788521 |
Failed to cherry-pick: 9788521 https://github.com/llvm/llvm-project/actions/runs/15423178980 Please manually backport the fix and push it to your github fork. Once this is done, please create a pull request |
…nown parameters. (llvm#142498) Backport 9788521
Backported manually: #142648 |
…s. (llvm#142498) If we see a parameter of reference type that isn't part of the frame, don't try to evaluate its default argument. Just treat it as a constexpr-unknown value. Fixes llvm#141114. Fixes llvm#141858.
…s. (llvm#142498) If we see a parameter of reference type that isn't part of the frame, don't try to evaluate its default argument. Just treat it as a constexpr-unknown value. Fixes llvm#141114. Fixes llvm#141858.
…nown parameters. (llvm#142498) Backport 9788521
If we see a parameter of reference type that isn't part of the frame, don't try to evaluate its default argument. Just treat it as a constexpr-unknown value.
Fixes #141114. Fixes #141858.