Ping
On Fri, 2019-01-25 at 15:02 -0500, David Malcolm wrote: > On Fri, 2019-01-25 at 08:59 -0800, Nathan Sidwell wrote: > > On 1/25/19 8:48 AM, David Malcolm wrote: > > > 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) {} > > > }; > > > > > > (is this valid? my knowledge of this part of C++ is fairly hazy) > > > > Yes. A more sensible example would have 'true' and 'false' replaced > > by > > something determined from the template parms. > > > > > > > > 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 > > > > I'd just drop the assert at this point. > > > > nathan > > Thanks. Here's a version of the patch which drops the assertion. > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. > > OK for trunk? > > 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. > --- > gcc/cp/class.c | 3 --- > gcc/testsuite/g++.dg/concepts/pr89036.C | 8 ++++++++ > 2 files changed, 8 insertions(+), 3 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/concepts/pr89036.C > > diff --git a/gcc/cp/class.c b/gcc/cp/class.c > index e8773c2..6e9dac9 100644 > --- a/gcc/cp/class.c > +++ b/gcc/cp/class.c > @@ -1133,9 +1133,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/g++.dg/concepts/pr89036.C > b/gcc/testsuite/g++.dg/concepts/pr89036.C > new file mode 100644 > index 0000000..f83ef8b > --- /dev/null > +++ b/gcc/testsuite/g++.dg/concepts/pr89036.C > @@ -0,0 +1,8 @@ > +// { dg-do compile { target c++11 } } > +// { dg-options "-fconcepts" } > + > +template<typename T> > +struct Y { > + ~Y() requires(true) = default; > + ~Y() requires(false) {} > +};