Author: Timm Bäder Date: 2024-09-17T05:58:54+02:00 New Revision: 95a0b4f729310d95d89f01f4d92ab7d2bf09941c
URL: https://github.com/llvm/llvm-project/commit/95a0b4f729310d95d89f01f4d92ab7d2bf09941c DIFF: https://github.com/llvm/llvm-project/commit/95a0b4f729310d95d89f01f4d92ab7d2bf09941c.diff LOG: Revert "[clang][ExprConst] Allow comparisons with string literals (#106733)" This reverts commit 5d1d2f08c4a92580e7f6b3b6b77b2b6f6184e126. See the discussion in https://github.com/llvm/llvm-project/pull/106733 and https://github.com/llvm/llvm-project/issues/58754 Added: Modified: clang/lib/AST/ExprConstant.cpp clang/test/AST/ByteCode/cxx20.cpp clang/test/SemaCXX/constant-expression-cxx11.cpp Removed: ################################################################################ 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<const Expr*>(); - return E && !isa<MaterializeTemporaryExpr, StringLiteral>(E); + return E && !isa<MaterializeTemporaryExpr>(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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits