On 11/16/22 15:27, Jason Merrill wrote:
On 11/16/22 11:06, Marek Polacek wrote:
On Wed, Nov 16, 2022 at 08:41:53AM -0500, Jason Merrill wrote:
On 11/15/22 19:30, Marek Polacek wrote:
@@ -996,19 +1040,26 @@ register_constexpr_fundef (const
constexpr_fundef &value)
**slot = value;
}
-/* FUN is a non-constexpr function called in a context that requires a
- constant expression. If it comes from a constexpr template,
explain why
- the instantiation isn't constexpr. */
+/* FUN is a non-constexpr (or, with -Wno-invalid-constexpr, a
constexpr
+ function called in a context that requires a constant expression).
+ If it comes from a constexpr template, explain why the
instantiation
+ isn't constexpr. */
The "if it comes from a constexpr template" wording has needed an
update for
a while now.
Probably ever since r178519. I've added "Otherwise, explain why the
function
cannot be used in a constexpr context." Is that acceptable?
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit15.C
@@ -0,0 +1,43 @@
+// PR c++/106649
+// P2448 - Relaxing some constexpr restrictions
+// { dg-do compile { target c++23 } }
+// { dg-options "-Winvalid-constexpr" }
+// A copy/move assignment operator for a class X that is defaulted and
+// not defined as deleted is implicitly defined when it is odr-used,
+// when it is needed for constant evaluation, or when it is explicitly
+// defaulted after its first declaration.
+// The implicitly-defined copy/move assignment operator is constexpr.
+
+struct S {
+ constexpr S() {}
+ S& operator=(const S&) = default; // #1
+ S& operator=(S&&) = default; // #2
+};
+
+struct U {
+ constexpr U& operator=(const U&) = default;
+ constexpr U& operator=(U&&) = default;
+};
+
+/* FIXME: If we only declare #1 and #2, and default them here:
+
+ S& S::operator=(const S&) = default;
+ S& S::operator=(S&&) = default;
+
+then they aren't constexpr. This sounds like a bug:
+<https://gcc.gnu.org/PR107598>. */
As I commented on the PR, I don't think this is actually a bug, so let's
omit this FIXME.
I'm glad I didn't really attempt to "fix" it (the inform message is
flawed
and should be improved). Thanks for taking a look.
Here's a version with the two comments updated.
Ok?
OK.
Since this patch I'm seeing these failures:
FAIL: g++.dg/cpp0x/constexpr-ex1.C -std=c++23 -fimplicit-constexpr at
line 91 (test for errors, line 89)
FAIL: g++.dg/cpp23/constexpr-nonlit10.C -std=gnu++23
-fimplicit-constexpr (test for warnings, line 14)
FAIL: g++.dg/cpp23/constexpr-nonlit10.C -std=gnu++23
-fimplicit-constexpr (test for warnings, line 20)
FAIL: g++.dg/cpp23/constexpr-nonlit11.C -std=gnu++23
-fimplicit-constexpr (test for warnings, line 28)
FAIL: g++.dg/cpp23/constexpr-nonlit11.C -std=gnu++23
-fimplicit-constexpr (test for warnings, line 31)
FAIL: g++.dg/cpp2a/spaceship-eq3.C -std=c++23 -fimplicit-constexpr
(test for excess errors)
Jason