From: dmalcolm Date: Wed, 13 Feb 2019 15:48:37 +0000 (+0000) Subject: C++ concepts: fix ICE with requires on dtors (PR c++/89036) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f2da1a764fb7e706bcd1b9975ecd024dbfd02756;p=thirdparty%2Fgcc.git 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 struct Y { ~Y() requires(true) = default; ~Y() requires(false) {} }; Nathan introduced this assertion as part of: ca9219bf18c68a001d62ecb981bc9176b0feaf12 (aka r251340): 2017-08-24 Nathan Sidwell 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@268847 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b423f7c9b1e5..8533fa81ee6f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-02-13 David Malcolm + + PR c++/89036 + * class.c (add_method): Drop destructor assertion. + 2019-02-13 Paolo Carlini PR c++/88986 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 48da081212af..f44acfd62b5e 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1134,9 +1134,6 @@ add_method (tree type, tree method, bool via_using) } } - /* A class should never have more than one destructor. */ - gcc_assert (!current_fns || via_using || !DECL_DESTRUCTOR_P (method)); - current_fns = ovl_insert (method, current_fns, via_using); if (!COMPLETE_TYPE_P (type) && !DECL_CONV_FN_P (method) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5f220ccae10f..583b0452d61d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-13 David Malcolm + + PR c++/89036 + * g++.dg/concepts/pr89036.C: New test. + 2019-02-13 Tamar Christina PR target/88847 diff --git a/gcc/testsuite/g++.dg/concepts/pr89036.C b/gcc/testsuite/g++.dg/concepts/pr89036.C new file mode 100644 index 000000000000..f83ef8b96793 --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/pr89036.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-fconcepts" } + +template +struct Y { + ~Y() requires(true) = default; + ~Y() requires(false) {} +};