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
