c++: ICE with defaulted comparison operator [PR94478]
authorMarek Polacek <polacek@redhat.com>
Tue, 7 Apr 2020 18:24:52 +0000 (14:24 -0400)
committerMarek Polacek <polacek@redhat.com>
Wed, 8 Apr 2020 12:56:07 +0000 (08:56 -0400)
Here we ICE because early_check_defaulted_comparison passed a null
ctx to same_type_p.  The attached test is ill-formed according to
[class.compare.default]/1, so fixed by detecting this case early.

PR c++/94478 - ICE with defaulted comparison operator
* method.c (early_check_defaulted_comparison): Give an error when the
context is null.

* g++.dg/cpp2a/spaceship-err4.C: New test.

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp2a/spaceship-err4.C [new file with mode: 0644]

index 561eb4e76f40e48be5da4ae69f729866dc0c3438..3fb9100e023773d2ca0b95b65e8a41431ff9f4b9 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-08  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/94478 - ICE with defaulted comparison operator
+       * method.c (early_check_defaulted_comparison): Give an error when the
+       context is null.
+
 2020-04-08  Tobias Burnus  <tobias@codesourcery.com>
 
        PR middle-end/94120
index 41b9ff86bdd046e5bf7cb128eb61ec7f15a1820a..9a21bfc1f667bf91b82ad7dcf8dce33a9c47c4c2 100644 (file)
@@ -1102,6 +1102,17 @@ early_check_defaulted_comparison (tree fn)
       return false;
     }
 
+  if (!ctx)
+    {
+      if (DECL_OVERLOADED_OPERATOR_IS (fn, SPACESHIP_EXPR))
+       error_at (loc, "three-way comparison operator can only be defaulted "
+                 "in a class definition");
+      else
+       error_at (loc, "equality comparison operator can only be defaulted "
+                 "in a class definition");
+      return false;
+    }
+
   if (!DECL_OVERLOADED_OPERATOR_IS (fn, SPACESHIP_EXPR)
       && !same_type_p (TREE_TYPE (TREE_TYPE (fn)), boolean_type_node))
     {
index 3913d212c6938274469b95d8df55d89f3d108449..278330f528f2afe318d594d5114756254073057e 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-08  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/94478 - ICE with defaulted comparison operator
+       * g++.dg/cpp2a/spaceship-err4.C: New test.
+
 2020-04-08  Alexandre Oliva <oliva@adacore.com>
 
        * gcc.target/arm/polytypes.c: Add quotes around
diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-err4.C b/gcc/testsuite/g++.dg/cpp2a/spaceship-err4.C
new file mode 100644 (file)
index 0000000..00f90ce
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/94478 - ICE with defaulted comparison operator.
+// { dg-do compile { target c++2a } }
+
+struct B {};
+bool operator!=(const B&, const B&) = default; // { dg-error "equality comparison operator can only be defaulted in a class definition" }
+bool operator==(const B&, const B&) = default; // { dg-error "equality comparison operator can only be defaulted in a class definition" }
+bool operator<=>(const B&, const B&) = default; // { dg-error "three-way comparison operator can only be defaulted in a class definition" }