Commit ec3ebf45 by Olivier Goffart Committed by Jason Merrill

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 <jason@redhat.com>

From-SVN: r180965
parent e98925f6
2011-11-04 Olivier Goffart <olivier@woboq.com>
Jason Merrill <jason@redhat.com>
PR c++/50965
* class.c (check_field_decls): NSDMI makes a class non-aggregate.
2011-11-04 Paolo Carlini <paolo.carlini@oracle.com> 2011-11-04 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/48420 PR c++/48420
......
...@@ -3189,6 +3189,12 @@ check_field_decls (tree t, tree *access_decls, ...@@ -3189,6 +3189,12 @@ check_field_decls (tree t, tree *access_decls,
no_const_asn_ref_p, no_const_asn_ref_p,
&any_default_members); &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 any field is const, the structure type is pseudo-const. */
if (CP_TYPE_CONST_P (type)) if (CP_TYPE_CONST_P (type))
{ {
......
...@@ -3205,8 +3205,9 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) ...@@ -3205,8 +3205,9 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
/* [dcl.init.aggr] /* [dcl.init.aggr]
An aggregate is an array or a class with no user-declared An aggregate is an array or a class with no user-provided
constructors, no private or protected non-static data members, no 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. base classes, and no virtual functions.
As an extension, we also treat vectors as aggregates. Keep these As an extension, we also treat vectors as aggregates. Keep these
......
2011-11-04 Olivier Goffart <olivier@woboq.com>
PR c++/50965
* g++.dg/cpp0x/nsdmi1.C: Add more cases.
2011-11-04 Jiangning Liu <jiangning.liu@arm.com> 2011-11-04 Jiangning Liu <jiangning.liu@arm.com>
PR rtl-optimization/38644 PR rtl-optimization/38644
......
...@@ -31,8 +31,8 @@ int main() ...@@ -31,8 +31,8 @@ int main()
{ {
A a1; A a1;
if (a1.i != 42) return 1; if (a1.i != 42) return 1;
A a2 = { 24 }; A a2{};
if (a2.i != 24) return 2; if (a2.i != 42) return 2;
A a3[1]; A a3[1];
if (a3[0].i != 42) return 3; if (a3[0].i != 42) return 3;
...@@ -43,7 +43,7 @@ int main() ...@@ -43,7 +43,7 @@ int main()
C<int,3> c1; C<int,3> c1;
if (c1.m != 3) return 5; if (c1.m != 3) return 5;
C<int,3> c2 { 5 }; C<int,5> c2 {};
if (c2.m != 5) return 6; if (c2.m != 5) return 6;
D<int,3> d1; D<int,3> d1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment