C++: Fix ICE when adding overloaded operator via using_decl (PR c++/88699)
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 17 Jan 2019 17:07:20 +0000 (17:07 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Thu, 17 Jan 2019 17:07:20 +0000 (17:07 +0000)
PR c++/88699 reports an ICE within this assertion in add_method:

  gcc_assert (!current_fns || !DECL_DESTRUCTOR_P (method));

when adding an overloaded operator to a class via a using_decl, due to
DECL_DESTRUCTOR_P requiring a FUNCTION_DECL, but "method" being a
USING_DECL.

This patch weakens the assertion to avoid testing DECL_DESTRUCTOR_P
for the case where "via_using" is true, fixing the ICE.

gcc/cp/ChangeLog:
PR c++/88699
* class.c (add_method): Don't use DECL_DESTRUCTOR_P on
USING_DECLs.

gcc/testsuite/ChangeLog:
PR c++/88699
* g++.dg/template/pr88699.C: New test.

From-SVN: r268041

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr88699.C [new file with mode: 0644]

index dec8d64d46f118fc34829f63fb2e1b22533d99d8..6893b2e4e332083af7fb45481b8f0486cf19b8b6 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-17  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c++/88699
+       * class.c (add_method): Don't use DECL_DESTRUCTOR_P on
+       USING_DECLs.
+
 2019-01-17  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/86610
index e7897f2e7d685689154dbc032367d01d345a188d..e8773c2a0b0ff3dec8a6f2fd50095ed9fd1ff9b3 100644 (file)
@@ -1134,7 +1134,7 @@ add_method (tree type, tree method, bool via_using)
     }
 
   /* A class should never have more than one destructor.  */
-  gcc_assert (!current_fns || !DECL_DESTRUCTOR_P (method));
+  gcc_assert (!current_fns || via_using || !DECL_DESTRUCTOR_P (method));
 
   current_fns = ovl_insert (method, current_fns, via_using);
 
index 31b171b628bce20dc36f11344f970b27e83f7407..176d2f8a79bdc8db9fe7f08ff10d9fe86428dbc3 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-17  David Malcolm  <dmalcolm@redhat.com>
+
+       PR c++/88699
+       * g++.dg/template/pr88699.C: New test.
+
 2019-01-17  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/88800
diff --git a/gcc/testsuite/g++.dg/template/pr88699.C b/gcc/testsuite/g++.dg/template/pr88699.C
new file mode 100644 (file)
index 0000000..ecd26ce
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+template <typename>
+struct A {
+  void operator= (int);
+  template <int> class B;
+};
+template <typename C>
+template <int>
+struct A<C>::B : A {
+  using A::operator=;
+  void operator= (B);
+};