From adc651f305521e0e8e46fe1fee904532140d7a5e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 2 Aug 2011 17:08:57 -0400 Subject: [PATCH] re PR c++/49803 ([C++0x] erroneous variant-member initialization in a union containing an anonymous struct) PR c++/49803 * init.c (sort_mem_initializers): Initialize uses_unions_p here. (build_field_list): Not here. From-SVN: r177213 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/init.c | 4 +--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/union5.C | 23 +++++++++++++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/union5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bba80e88918..dc138a187b2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-08-02 Jason Merrill + PR c++/49803 + * init.c (sort_mem_initializers): Initialize uses_unions_p here. + (build_field_list): Not here. + PR c++/49834 * parser.c (build_range_temp): Split out from... (cp_convert_range_for): ...here. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 52b948441f2..31171cfa686 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -655,8 +655,6 @@ build_field_list (tree t, tree list, int *uses_unions_p) { tree fields; - *uses_unions_p = 0; - /* Note whether or not T is a union. */ if (TREE_CODE (t) == UNION_TYPE) *uses_unions_p = 1; @@ -710,7 +708,7 @@ sort_mem_initializers (tree t, tree mem_inits) tree next_subobject; VEC(tree,gc) *vbases; int i; - int uses_unions_p; + int uses_unions_p = 0; /* Build up a list of initializations. The TREE_PURPOSE of entry will be the subobject (a FIELD_DECL or BINFO) to initialize. The diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82f2776ba46..6b471694d3c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-08-02 Jason Merrill + + PR c++/49803 + * g++.dg/cpp0x/union5.C: New. + 2011-08-02 Daniel Kraft PR fortran/49885 diff --git a/gcc/testsuite/g++.dg/cpp0x/union5.C b/gcc/testsuite/g++.dg/cpp0x/union5.C new file mode 100644 index 00000000000..423b3482323 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union5.C @@ -0,0 +1,23 @@ +// PR c++/49803 +// { dg-options -std=c++0x } + +struct X +{ + X() = delete; +}; + +union Y +{ + // N3291=11-0061 12.6.2/8 says no initialization of + // of other variant members (i.e. m_x) should + // be performed. + Y() : m_char1{ } + { } + + struct + { + char m_char1; + }; + + X m_x; +};