aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-12-21 00:19:23 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-12-21 00:19:23 +0100
commitb804bd89d3a8ff3ab6b916d2982b83f805cc6256 (patch)
tree8a1097c4821acbaa53300ecce02b6a2f911f4b32
parent8aca5ebe07efd6d710c76eff2d3524f6c5c4ff2b (diff)
downloadgcc-b804bd89d3a8ff3ab6b916d2982b83f805cc6256.zip
gcc-b804bd89d3a8ff3ab6b916d2982b83f805cc6256.tar.gz
gcc-b804bd89d3a8ff3ab6b916d2982b83f805cc6256.tar.bz2
re PR c++/92966 (Segfault on defaulted operator== with wrong return type)
PR c++/92966 * method.c (early_check_defaulted_comparison): Don't set DECL_MAYBE_DELETED when returning false. * g++.dg/cpp2a/spaceship-eq8.C: New test. From-SVN: r279683
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/method.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/spaceship-eq8.C8
4 files changed, 16 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 07200ad..4ccee73 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2019-12-20 Jakub Jelinek <jakub@redhat.com>
+ PR c++/92966
+ * method.c (early_check_defaulted_comparison): Don't set
+ DECL_MAYBE_DELETED when returning false.
+
PR c++/92973
* method.c (early_check_defaulted_comparison): For C++17 and earlier
diagnose defaulted comparison operators.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 248a0e5..69e1262 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1153,7 +1153,7 @@ early_check_defaulted_comparison (tree fn)
}
/* We still need to deduce deleted/constexpr/noexcept and maybe return. */
- DECL_MAYBE_DELETED (fn) = true;
+ DECL_MAYBE_DELETED (fn) = ok;
return ok;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 40568bb..b357e1e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2019-12-20 Jakub Jelinek <jakub@redhat.com>
+ PR c++/92966
+ * g++.dg/cpp2a/spaceship-eq8.C: New test.
+
PR c++/92973
* g++.dg/cpp0x/spaceship-eq1.C: New test.
diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-eq8.C b/gcc/testsuite/g++.dg/cpp2a/spaceship-eq8.C
new file mode 100644
index 0000000..aabbd32
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/spaceship-eq8.C
@@ -0,0 +1,8 @@
+// PR c++/92966
+// { dg-do compile { target c++2a } }
+
+struct S {
+ int operator==(const S&) const = default; // { dg-error "must return 'bool'" }
+ int s; // { dg-message "declared here" "" { target *-*-* } .-1 }
+};
+static_assert(S{} == S{}); // { dg-error "" }