PR c++/88380 - wrong-code with flexible array and NSDMI.
authorJason Merrill <jason@redhat.com>
Wed, 20 Feb 2019 18:54:45 +0000 (13:54 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 20 Feb 2019 18:54:45 +0000 (13:54 -0500)
Here 'skipped' was set to -1 to force an explicit initializer for 'uninit'
before the initializer for 'initialized', and so we also tried to emit an
explicit initializer for the flexible array, for which build_zero_init
returns error_mark_node.  We should ignore flexarrays even when
skipped < 0.

* typeck2.c (process_init_constructor_record): Skip flexarrays.

From-SVN: r269046

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/ext/flexary33.C [new file with mode: 0644]

index 83d3ac94039214778a0873f303bb5f42175cd388..02e0845f1d7ceeb0c9a8f373e8745dd917022bb9 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/88380 - wrong-code with flexible array and NSDMI.
+       * typeck2.c (process_init_constructor_record): Skip flexarrays.
+
 2019-02-20  will wray  <wjwray@gmail.com>
 
        PR c++/88572 - wrong handling of braces on scalar init.
index 4e4b1f03b7cda511b208ef127884fedf8c01cf07..af56632c0fc3ceae54a699e99069cc4934429bb1 100644 (file)
@@ -1602,12 +1602,15 @@ process_init_constructor_record (tree type, tree init, int nested, int flags,
              else
                return PICFLAG_ERRONEOUS;
            }
+         /* Do nothing for flexible array members since they need not have any
+            elements.  Don't worry about 'skipped' because a flexarray has to
+            be the last field.  */
+         else if (TREE_CODE (fldtype) == ARRAY_TYPE && !TYPE_DOMAIN (fldtype))
+           continue;
 
          /* Warn when some struct elements are implicitly initialized
-            to zero.  However, avoid issuing the warning for flexible
-            array members since they need not have any elements.  */
-         if ((TREE_CODE (fldtype) != ARRAY_TYPE || TYPE_DOMAIN (fldtype))
-             && (complain & tf_warning)
+            to zero.  */
+         if ((complain & tf_warning)
              && !EMPTY_CONSTRUCTOR_P (init))
            warning (OPT_Wmissing_field_initializers,
                     "missing initializer for member %qD", field);
diff --git a/gcc/testsuite/g++.dg/ext/flexary33.C b/gcc/testsuite/g++.dg/ext/flexary33.C
new file mode 100644 (file)
index 0000000..a12a634
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/88380
+// { dg-do compile { target c++14 } }
+// { dg-options "" }
+
+struct S {
+  char uninit;
+  char initialised = 11;
+  char variable[];
+};
+
+constexpr S p {};
+#define SA(X) static_assert((X),#X)
+SA(p.initialised == 11);