================
@@ -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 b3 = name1() == name1(); // ref-error {{must be initialized by
a constant expression}} \
+ // ref-note {{comparison of addresses
of literals}}
+constexpr auto b4 = name1() == name2();
+static_assert(!b4);
----------------
zygoloid wrote:
The C++ model in general is that each evaluation of a string literal expression
can produce a distinct object, and that these objects can fully or partially
overlap each other in memory when they have suitable values; that's the model
that this PR is implementing.
`b3` is non-constant because each call to `name1()` can produce a distinct
value, so the comparison result is unspecified. `b4` is constant and `false`
under this PR because the values returned by `name1()` and `name2()` cannot
possibly be the same -- those two string literal evaluations can't produce the
same value because the strings have different contents.
https://github.com/llvm/llvm-project/pull/109208
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits