[clang] [clang][ExprConst] Don't diagnose a non-existent init as not constant (PR #124575)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 27 07:56:40 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/124575.diff
3 Files Affected:
- (modified) clang/lib/AST/ExprConstant.cpp (+6-2)
- (modified) clang/test/SemaCXX/constant-expression-cxx11.cpp (+4-4)
- (modified) clang/test/SemaCXX/constant-expression-p2280r4.cpp (+1-2)
``````````diff
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index be8f1fe02e7212..4681511b8b4140 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -3600,8 +3600,12 @@ static bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E,
VD->mightBeUsableInConstantExpressions(Info.Ctx)) ||
((Info.getLangOpts().CPlusPlus || Info.getLangOpts().OpenCL) &&
!Info.getLangOpts().CPlusPlus11 && !VD->hasICEInitializer(Info.Ctx))) {
- Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;
- NoteLValueLocation(Info, Base);
+ if (VD->getAnyInitializer()) {
+ Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;
+ NoteLValueLocation(Info, Base);
+ } else {
+ Info.CCEDiag(E);
+ }
}
// Never use the initializer of a weak variable, not even for constant
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp
index a1234b67acd6dc..76e2f81947051d 100644
--- a/clang/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp
@@ -1462,7 +1462,7 @@ namespace InstantiateCaseStmt {
namespace ConvertedConstantExpr {
extern int &m;
- extern int &n; // expected-note 2{{declared here}}
+ extern int &n; // pre-cxx23-note 2{{declared here}}
constexpr int k = 4;
int &m = const_cast<int&>(k);
@@ -1471,9 +1471,9 @@ namespace ConvertedConstantExpr {
// useless note and instead just point to the non-constant subexpression.
enum class E {
em = m,
- en = n, // cxx23-note {{initializer of 'n' is not a constant expression}} expected-error {{enumerator value is not a constant expression}} cxx11_20-note {{initializer of 'n' is unknown}}
- eo = (m + // expected-error {{not a constant expression}}
- n // cxx23-note {{initializer of 'n' is not a constant expression}} cxx11_20-note {{initializer of 'n' is unknown}}
+ en = n, // expected-error {{enumerator value is not a constant expression}} cxx11_20-note {{initializer of 'n' is unknown}}
+ eo = (m + // pre-cxx23-error {{not a constant expression}}
+ n // cxx11_20-note {{initializer of 'n' is unknown}} cxx23-error {{not a constant expression}}
),
eq = reinterpret_cast<long>((int*)0) // expected-error {{not a constant expression}} expected-note {{reinterpret_cast}}
};
diff --git a/clang/test/SemaCXX/constant-expression-p2280r4.cpp b/clang/test/SemaCXX/constant-expression-p2280r4.cpp
index 0f85c60629eed9..8648350b397e0b 100644
--- a/clang/test/SemaCXX/constant-expression-p2280r4.cpp
+++ b/clang/test/SemaCXX/constant-expression-p2280r4.cpp
@@ -47,11 +47,10 @@ void splash(Swim& swam) {
}
extern Swim dc;
-extern Swim& trident; // expected-note {{declared here}}
+extern Swim& trident;
constexpr auto& sandeno = typeid(dc); // ok: can only be typeid(Swim)
constexpr auto& gallagher = typeid(trident); // expected-error {{constexpr variable 'gallagher' must be initialized by a constant expression}}
- // expected-note at -1 {{initializer of 'trident' is not a constant expression}}
namespace explicitThis {
struct C {
``````````
</details>
https://github.com/llvm/llvm-project/pull/124575
More information about the cfe-commits
mailing list