diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index be8f1fe02e721..0e41e3dbc8a32 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 (Init) { + 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 a1234b67acd6d..76e2f81947051 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(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((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 0f85c60629eed..8648350b397e0 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@-1 {{initializer of 'trident' is not a constant expression}} namespace explicitThis { struct C {