aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-08-02 17:08:57 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-08-02 17:08:57 -0400
commitadc651f305521e0e8e46fe1fee904532140d7a5e (patch)
tree85932c48fd6620e32bfa62016f01cc224040919c /gcc
parent9f8139900d3b6be84b303ad505cf5899e95d8ea2 (diff)
downloadgcc-adc651f305521e0e8e46fe1fee904532140d7a5e.zip
gcc-adc651f305521e0e8e46fe1fee904532140d7a5e.tar.gz
gcc-adc651f305521e0e8e46fe1fee904532140d7a5e.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/init.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/union5.C23
4 files changed, 33 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bba80e8..dc138a1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2011-08-02 Jason Merrill <jason@redhat.com>
+ 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 52b9484..31171cf 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 82f2776..6b47169 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-08-02 Jason Merrill <jason@redhat.com>
+
+ PR c++/49803
+ * g++.dg/cpp0x/union5.C: New.
+
2011-08-02 Daniel Kraft <d@domob.eu>
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 0000000..423b348
--- /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;
+};