PR c++/80179 - ICE with initialized flexible array member.
authorJason Merrill <jason@redhat.com>
Fri, 21 Apr 2017 19:26:54 +0000 (15:26 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 21 Apr 2017 19:26:54 +0000 (15:26 -0400)
* constexpr.c (verify_ctor_sanity): Handle flexible array members.

From-SVN: r247067

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

index dad7a0a..6799e2e 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-21  Jason Merrill  <jason@redhat.com>
+
+       PR c++/80179 - ICE with initialized flexible array member.
+       * constexpr.c (verify_ctor_sanity): Handle flexible array members.
+
 2017-04-21  Richard Biener  <rguenther@suse.de>
 
        * cp-tree.h (copy_decl): Annotate with CXX_MEM_STAT_INFO.
index 9dde4a4..366d562 100644 (file)
@@ -2643,8 +2643,16 @@ verify_ctor_sanity (const constexpr_ctx *ctx, tree type)
   /* We used to check that ctx->ctor was empty, but that isn't the case when
      the object is zero-initialized before calling the constructor.  */
   if (ctx->object)
-    gcc_assert (same_type_ignoring_top_level_qualifiers_p
-               (type, TREE_TYPE (ctx->object)));
+    {
+      tree otype = TREE_TYPE (ctx->object);
+      gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, otype)
+                 /* Handle flexible array members.  */
+                 || (TREE_CODE (otype) == ARRAY_TYPE
+                     && TYPE_DOMAIN (otype) == NULL_TREE
+                     && TREE_CODE (type) == ARRAY_TYPE
+                     && (same_type_ignoring_top_level_qualifiers_p
+                         (TREE_TYPE (type), TREE_TYPE (otype)))));
+    }
   gcc_assert (!ctx->object || !DECL_P (ctx->object)
              || *(ctx->values->get (ctx->object)) == ctx->ctor);
 }
diff --git a/gcc/testsuite/g++.dg/ext/flexary24.C b/gcc/testsuite/g++.dg/ext/flexary24.C
new file mode 100644 (file)
index 0000000..c25e540
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/80179
+// { dg-options "" }
+
+struct S {
+  int n;
+  const char *a[];
+};
+
+void bar (const char *a)
+{
+  static const S t = { 1, { a, "b" } };
+}