diff mbox series

C++: Fix ICE when adding overloaded operator via using_decl (PR c++/88699)

Message ID 1547682286-56791-1-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series C++: Fix ICE when adding overloaded operator via using_decl (PR c++/88699) | expand

Commit Message

David Malcolm Jan. 16, 2019, 11:44 p.m. UTC
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.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.

OK for trunk?

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.
---
 gcc/cp/class.c                          |  2 +-
 gcc/testsuite/g++.dg/template/pr88699.C | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/template/pr88699.C

Comments

Nathan Sidwell Jan. 17, 2019, 12:06 p.m. UTC | #1
On 1/16/19 6:44 PM, David Malcolm wrote:
> 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.
> 
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
> 
> OK for trunk?
> 
> 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.

ok thanks
diff mbox series

Patch

diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index e7897f2..e8773c2 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -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);
 
diff --git a/gcc/testsuite/g++.dg/template/pr88699.C b/gcc/testsuite/g++.dg/template/pr88699.C
new file mode 100644
index 0000000..ecd26ce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr88699.C
@@ -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);
+};