https://github.com/tbaederr updated 
https://github.com/llvm/llvm-project/pull/106733

>From 7dbb01805663a6671c61330c5abc04c44146cc24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com>
Date: Fri, 30 Aug 2024 15:52:48 +0200
Subject: [PATCH] [clang][ExprConst] Allow comparisons with string literals

---
 clang/lib/AST/ExprConstant.cpp                   |  2 +-
 clang/test/AST/ByteCode/cxx20.cpp                | 14 ++++----------
 clang/test/SemaCXX/constant-expression-cxx11.cpp |  6 ++----
 3 files changed, 7 insertions(+), 15 deletions(-)

diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index e8a4d1d3c74102..869745db32f443 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -2142,7 +2142,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>(E);
+  return E && !isa<MaterializeTemporaryExpr, StringLiteral>(E);
 }
 
 static bool IsWeakLValue(const LValue &Value) {
diff --git a/clang/test/AST/ByteCode/cxx20.cpp 
b/clang/test/AST/ByteCode/cxx20.cpp
index 77a967d42c4efe..13517a059f340c 100644
--- a/clang/test/AST/ByteCode/cxx20.cpp
+++ b/clang/test/AST/ByteCode/cxx20.cpp
@@ -108,22 +108,16 @@ constexpr auto p2 = "test2";
 constexpr bool b1 = foo(p1) == foo(p1);
 static_assert(b1);
 
-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 bool b2 = foo(p1) == foo(p2);
+static_assert(!b2);
 
 constexpr auto name1() { return "name1"; }
 constexpr auto name2() { return "name2"; }
 
 constexpr auto b3 = name1() == name1();
 static_assert(b3);
-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}}
+constexpr auto b4 = name1() == name2();
+static_assert(!b4);
 
 namespace UninitializedFields {
   class A {
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp 
b/clang/test/SemaCXX/constant-expression-cxx11.cpp
index 44ef540f41fa8c..d2d2f1a127eaeb 100644
--- a/clang/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp
@@ -358,11 +358,9 @@ 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"; // 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}}
+constexpr bool litaddress = "foo" == "foo"; // cxx20_23-warning {{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

Reply via email to