Hi,

today I spent quite a bit of time on this reject legal issue filed by Daniel, having to do with constrexpr constructors and anonymous union members: I didn't want to make the loop much more complex but we have to handle correctly multiple anonymous union too and of course produce correct diagnostics in all cases (eg, together with multiple members initialization diagnostics too). I figured out the below. Tested x86_64-linux, as usual.

Thanks,
Paolo.

////////////////////////
/cp
2012-10-22  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/54922
        * semantics.c (cx_check_missing_mem_inits): Handle anonymous union
        members.

/testsuite
2012-10-22  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/54922
        * g++.dg/cpp0x/constexpr-union4.C: New.
Index: testsuite/g++.dg/cpp0x/constexpr-union4.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-union4.C   (revision 0)
+++ testsuite/g++.dg/cpp0x/constexpr-union4.C   (working copy)
@@ -0,0 +1,13 @@
+// PR c++/54922
+// { dg-do compile { target c++11 } }
+
+class nullable_int
+{
+  bool init_;
+  union {
+    unsigned char for_value_init;
+    int value_;
+  };
+public:
+  constexpr nullable_int() : init_(false), for_value_init() {}
+};
Index: cp/semantics.c
===================================================================
--- cp/semantics.c      (revision 192692)
+++ cp/semantics.c      (working copy)
@@ -6139,17 +6139,23 @@ cx_check_missing_mem_inits (tree fun, tree body, b
   for (i = 0; i <= nelts; ++i)
     {
       tree index;
+      tree anon_union_init_type = NULL_TREE;
       if (i == nelts)
        index = NULL_TREE;
       else
        {
          index = CONSTRUCTOR_ELT (body, i)->index;
+         /* Handle anonymous union members.  */
+         if (TREE_CODE (index) == COMPONENT_REF
+             && ANON_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (index, 0))))
+           anon_union_init_type = TREE_TYPE (TREE_OPERAND (index, 0));
          /* Skip base and vtable inits.  */
-         if (TREE_CODE (index) != FIELD_DECL
-             || DECL_ARTIFICIAL (index))
+         else if (TREE_CODE (index) != FIELD_DECL
+                  || DECL_ARTIFICIAL (index))
            continue;
        }
-      for (; field != index; field = DECL_CHAIN (field))
+      for (; field != index && TREE_TYPE (field) != anon_union_init_type;
+          field = DECL_CHAIN (field))
        {
          tree ftype;
          if (TREE_CODE (field) != FIELD_DECL

Reply via email to