This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] For -std=c++1z treat class types with inherited ctors as non-aggregate (PR c++/79143, take 3)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 9 Feb 2017 15:16:25 +0100
- Subject: [C++ PATCH] For -std=c++1z treat class types with inherited ctors as non-aggregate (PR c++/79143, take 3)
- Authentication-results: sourceware.org; auth=none
- References: <20170207213036.GX1849@tucnak> <CADzB+2mYe=BHpFozbRPaPFZGonqzCUj2pPpWKBat+uZW9bSVxw@mail.gmail.com> <20170208222437.GF1849@tucnak> <CADzB+2mG64dz_YvypfUC80m2-TMhtjv3xwatLVkc7pUazw-9=g@mail.gmail.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Wed, Feb 08, 2017 at 06:47:10PM -0500, Jason Merrill wrote:
> On Wed, Feb 8, 2017 at 5:24 PM, Jakub Jelinek <jakub@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 <jakub@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 <jakub@redhat.com>
Jason Merrill <jason@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