diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-12-11 19:44:02 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-12-11 19:44:02 +0100 |
commit | 3455115379cef3a84ce8154b6c4316ed7585f73f (patch) | |
tree | 5b7319588d18fd1066a4ea5b9d073dccdce3f506 /gcc/cp | |
parent | c20f7e9971d35b89f17ee6a1bc8ab2462288adda (diff) | |
download | gcc-3455115379cef3a84ce8154b6c4316ed7585f73f.zip gcc-3455115379cef3a84ce8154b6c4316ed7585f73f.tar.gz gcc-3455115379cef3a84ce8154b6c4316ed7585f73f.tar.bz2 |
re PR c++/92869 (C++17 wrongly reports aggregate type as not-aggregate (when explicitly defaulted ctors are added))
PR c++/92869
* class.c (finish_struct): For C++17 and earlier, check
type_has_user_provided_or_explicit_constructor rather than
TYPE_HAS_USER_CONSTRUCTOR whether to set CLASSTYPE_NON_AGGREGATE.
* g++.dg/cpp0x/aggr3.C: New test.
From-SVN: r279241
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/class.c | 8 |
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5a2ba31..d8a6ae3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2019-12-11 Jakub Jelinek <jakub@redhat.com> + + PR c++/92869 + * class.c (finish_struct): For C++17 and earlier, check + type_has_user_provided_or_explicit_constructor rather than + TYPE_HAS_USER_CONSTRUCTOR whether to set CLASSTYPE_NON_AGGREGATE. + 2019-12-11 Marek Polacek <polacek@redhat.com> PR c++/92878 - Parenthesized init of aggregates in new-expression. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index a8c6b1c..9b0cf50 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -7474,7 +7474,13 @@ finish_struct (tree t, tree attributes) /* Remember current #pragma pack value. */ TYPE_PRECISION (t) = maximum_field_alignment; - if (TYPE_HAS_USER_CONSTRUCTOR (t)) + if (cxx_dialect < cxx2a) + { + if (!CLASSTYPE_NON_AGGREGATE (t) + && type_has_user_provided_or_explicit_constructor (t)) + CLASSTYPE_NON_AGGREGATE (t) = 1; + } + else if (TYPE_HAS_USER_CONSTRUCTOR (t)) CLASSTYPE_NON_AGGREGATE (t) = 1; /* Fix up any variants we've already built. */ |