https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89036
--- Comment #5 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 <nat...@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