From ec3ebf4556b47fae3d51c12e0d8f115302d8ef15 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 4 Nov 2011 17:15:02 +0000 Subject: re PR c++/50965 (C++11 Non static member initializer are not run when class is initialized with {}) PR c++/50965 * class.c (check_field_decls): NSDMI makes a class non-aggregate. Co-Authored-By: Jason Merrill From-SVN: r180965 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/class.c | 6 ++++++ gcc/cp/cp-tree.h | 5 +++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/nsdmi1.C | 6 +++--- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 47e79fe..27c8b70 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-11-04 Olivier Goffart + Jason Merrill + + PR c++/50965 + * class.c (check_field_decls): NSDMI makes a class non-aggregate. + 2011-11-04 Paolo Carlini PR c++/48420 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 41d182a..1775868 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -3189,6 +3189,12 @@ check_field_decls (tree t, tree *access_decls, no_const_asn_ref_p, &any_default_members); + /* Now that we've removed bit-field widths from DECL_INITIAL, + anything left in DECL_INITIAL is an NSDMI that makes the class + non-aggregate. */ + if (DECL_INITIAL (x)) + CLASSTYPE_NON_AGGREGATE (t) = true; + /* If any field is const, the structure type is pseudo-const. */ if (CP_TYPE_CONST_P (type)) { diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index dc52d29..c941abc 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3205,8 +3205,9 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) /* [dcl.init.aggr] - An aggregate is an array or a class with no user-declared - constructors, no private or protected non-static data members, no + An aggregate is an array or a class with no user-provided + constructors, no brace-or-equal-initializers for non-static data + members, no private or protected non-static data members, no base classes, and no virtual functions. As an extension, we also treat vectors as aggregates. Keep these diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f47a503..c9bd248 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-04 Olivier Goffart + + PR c++/50965 + * g++.dg/cpp0x/nsdmi1.C: Add more cases. + 2011-11-04 Jiangning Liu PR rtl-optimization/38644 diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C index f6381d0..159c16d 100644 --- a/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi1.C @@ -31,8 +31,8 @@ int main() { A a1; if (a1.i != 42) return 1; - A a2 = { 24 }; - if (a2.i != 24) return 2; + A a2{}; + if (a2.i != 42) return 2; A a3[1]; if (a3[0].i != 42) return 3; @@ -43,7 +43,7 @@ int main() C c1; if (c1.m != 3) return 5; - C c2 { 5 }; + C c2 {}; if (c2.m != 5) return 6; D d1; -- cgit v1.1