OK.
On Thu, Feb 9, 2017 at 9:16 AM, Jakub Jelinek <ja...@redhat.com> wrote: > On Wed, Feb 08, 2017 at 06:47:10PM -0500, Jason Merrill wrote: >> On Wed, Feb 8, 2017 at 5:24 PM, Jakub Jelinek <ja...@redhat.com> wrote: >> > On Wed, Feb 08, 2017 at 04:51:54PM -0500, Jason Merrill wrote: >> >> On Tue, Feb 7, 2017 at 4:30 PM, Jakub Jelinek <ja...@redhat.com> wrote: >> >> > P0017R1 added in [dcl.init.aggr]/1 that classes with inherited >> >> > constructors >> >> > are not aggregate. CLASSTYPE_NON_AGGREGATE is set slightly before >> >> > add_implicitly_declared_members is called and so we don't know about the >> >> > inherited ctors yet. >> >> >> >> Hmm, why doesn't my patch for 78124 to set CLASSTYPE_NON_AGGREGATE in >> >> do_class_using_decl cover this testcase? >> > >> > It does set CLASSTYPE_NON_AGGREGATE on a different RECORD_TYPE, >> > do_class_using_decl sees the template, while what is tested and what >> > check_bases_and_members is called on is the implicit instantiation thereof. >> > >> > The following completely untested patch also fixes it. Or is there some >> > even better place where to copy over that bit from the template to the >> > instantiation? >> >> Better I think in instantiate_class_template_1, about where we copy >> TYPE_PACKED. > > That works too, bootstrapped/regtested on x86_64-linux and i686-linux, ok > for trunk? > > 2017-02-09 Jakub Jelinek <ja...@redhat.com> > Jason Merrill <ja...@redhat.com> > > PR c++/79143 > * pt.c (instantiate_class_template_1): Copy CLASSTYPE_NON_AGGREGATE > from pattern to type. > > * g++.dg/cpp1z/pr79143.C: New test. > > --- gcc/cp/pt.c.jj 2017-02-06 21:02:40.000000000 +0100 > +++ gcc/cp/pt.c 2017-02-09 00:57:58.961930210 +0100 > @@ -10253,6 +10253,7 @@ instantiate_class_template_1 (tree type) > TYPE_PACKED (type) = TYPE_PACKED (pattern); > SET_TYPE_ALIGN (type, TYPE_ALIGN (pattern)); > TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (pattern); > + CLASSTYPE_NON_AGGREGATE (type) = CLASSTYPE_NON_AGGREGATE (pattern); > if (ANON_AGGR_TYPE_P (pattern)) > SET_ANON_AGGR_TYPE_P (type); > if (CLASSTYPE_VISIBILITY_SPECIFIED (pattern)) > --- gcc/testsuite/g++.dg/cpp1z/pr79143.C.jj 2017-02-07 17:55:19.091028200 > +0100 > +++ gcc/testsuite/g++.dg/cpp1z/pr79143.C 2017-02-07 17:54:48.000000000 > +0100 > @@ -0,0 +1,28 @@ > +// PR c++/79143 > +// { dg-do compile } > +// { dg-options "-std=c++1z" } > + > +struct base { > + base (int, int) {} > +}; > + > +template<class> > +struct derived : base { > + using base::base; > +}; > + > +template<class> > +struct derived2 : base { > + derived2 (int x, int y) : base (x, y) {} > +}; > + > +int > +main () > +{ > + base (13, 42); > + derived<int> (13, 42); > + derived2<int> (13, 42); > + base{13, 42}; > + derived<int>{13, 42}; // { dg-bogus "too many initializers" } > + derived2<int>{13, 42}; > +} > > > Jakub