[Bug c++/88699] [9 Regression] tree check fail: expected function_decl, have using_decl in add_method, at cp/class.c:1137

dmalcolm at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Feb 13 15:49:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88699

--- Comment #10 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Author: dmalcolm
Date: Wed Feb 13 15:48:37 2019
New Revision: 268847

URL: https://gcc.gnu.org/viewcvs?rev=268847&root=gcc&view=rev
Log:
C++ concepts: fix ICE with requires on dtors (PR c++/89036)

PR c++/89036 reports an ICE due to this assertion failing

1136      /* A class should never have more than one destructor.  */
1137      gcc_assert (!current_fns || via_using || !DECL_DESTRUCTOR_P
(method));

on this template with a pair of dtors, with
mutually exclusive "requires" clauses:

template<typename T>
struct Y {
    ~Y() requires(true) = default;
    ~Y() requires(false) {}
};

Nathan introduced this assertion as part of:

  ca9219bf18c68a001d62ecb981bc9176b0feaf12 (aka r251340):
    2017-08-24  Nathan Sidwell  <nathan@acm.org>
       Conversion operators kept on single overload set

which, amongst other changes to add_method had this:
     /* A class should never have more than one destructor.  */
  -  if (current_fns && DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (method))
  -    return false;
  +  gcc_assert (!current_fns || !DECL_DESTRUCTOR_P (method));

The following patch drops the assertion (I already had to generalize
the assertion in r268041 to fix PR c++/88699).

gcc/cp/ChangeLog:
        PR c++/89036
        * class.c (add_method): Drop destructor assertion.

gcc/testsuite/ChangeLog:
        PR c++/89036
        * g++.dg/concepts/pr89036.C: New test.


Added:
    trunk/gcc/testsuite/g++.dg/concepts/pr89036.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/class.c
    trunk/gcc/testsuite/ChangeLog


More information about the Gcc-bugs mailing list