diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 4af7752d3b238b..6387e375dda79c 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2146,7 +2146,7 @@ static bool IsLiteralLValue(const LValue &Value) { if (Value.getLValueCallIndex()) return false; const Expr *E = Value.Base.dyn_cast(); - return E && !isa(E); + return E && !isa(E); } static bool IsWeakLValue(const LValue &Value) { diff --git a/clang/test/AST/ByteCode/cxx20.cpp b/clang/test/AST/ByteCode/cxx20.cpp index b47a4b47d09644..9bbc3dbe0073d3 100644 --- a/clang/test/AST/ByteCode/cxx20.cpp +++ b/clang/test/AST/ByteCode/cxx20.cpp @@ -108,16 +108,22 @@ constexpr auto p2 = "test2"; constexpr bool b1 = foo(p1) == foo(p1); static_assert(b1); -constexpr bool b2 = foo(p1) == foo(p2); -static_assert(!b2); +constexpr bool b2 = foo(p1) == foo(p2); // ref-error {{must be initialized by a constant expression}} \ + // ref-note {{comparison of addresses of literals}} \ + // ref-note {{declared here}} +static_assert(!b2); // ref-error {{not an integral constant expression}} \ + // ref-note {{not a constant expression}} constexpr auto name1() { return "name1"; } constexpr auto name2() { return "name2"; } constexpr auto b3 = name1() == name1(); static_assert(b3); -constexpr auto b4 = name1() == name2(); -static_assert(!b4); +constexpr auto b4 = name1() == name2(); // ref-error {{must be initialized by a constant expression}} \ + // ref-note {{has unspecified value}} \ + // ref-note {{declared here}} +static_assert(!b4); // ref-error {{not an integral constant expression}} \ + // ref-note {{not a constant expression}} namespace UninitializedFields { class A { diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index d2d2f1a127eaeb..44ef540f41fa8c 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -358,9 +358,11 @@ struct Str { extern char externalvar[]; constexpr bool constaddress = (void *)externalvar == (void *)0x4000UL; // expected-error {{must be initialized by a constant expression}} expected-note {{reinterpret_cast}} -constexpr bool litaddress = "foo" == "foo"; // cxx20_23-warning {{comparison between two arrays is deprecated}} +constexpr bool litaddress = "foo" == "foo"; // expected-error {{must be initialized by a constant expression}} +// expected-note@-1 {{comparison of addresses of literals has unspecified value}} +// cxx20_23-warning@-2 {{comparison between two arrays is deprecated}} static_assert(0 != "foo", ""); -static_assert("foo" != "foo", "");// cxx20_23-warning {{comparison between two arrays is deprecated}} + } namespace MaterializeTemporary {