public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] #69290 - [6 Regression] ICE on invalid initialization of a flexible array member
@ 2016-01-21 22:55 Martin Sebor
  0 siblings, 0 replies; only message in thread
From: Martin Sebor @ 2016-01-21 22:55 UTC (permalink / raw)
  To: Gcc Patch List, Jason Merrill

[-- Attachment #1: Type: text/plain, Size: 655 bytes --]

The attached patch fixes another ICE triggered by an invalid
initialization of a flexible array member, and caused by making
the upper bound of the TYPE_DOMAIN() of such arrays null.

Martin

PS Jason, when you have a chance, there are two other patches
for similar P1 failures waiting for your review:

[PATCH] fix #69251 - [6 Regression] ICE in unify_array_domain on
   a flexible array member
   https://gcc.gnu.org/ml/gcc-patches/2016-01/msg01348.html

[PATCH] fix #69253 - [6 Regression] ICE in
    cxx_incomplete_type_diagnostic initializing a flexible array
    member with empty string
    https://gcc.gnu.org/ml/gcc-patches/2016-01/msg01325.html

[-- Attachment #2: gcc-69290.patch --]
[-- Type: text/x-patch, Size: 2774 bytes --]

PR c++/69290 - [6 Regression] ICE on invalid initialization of a flexible
    array member

gcc/testsuite/ChangeLog:
2016-01-21  Martin Sebor  <msebor@redhat.com>

	PR c++/69290
	* g++.dg/ext/flexary12.C: New test.

gcc/cp/ChangeLog:
2016-01-21  Martin Sebor  <msebor@redhat.com>

	PR c++/69290
	* tree.c (array_of_runtime_bound_p): Handle flexible array members.
Index: gcc/cp/tree.c
===================================================================
--- gcc/cp/tree.c	(revision 232692)
+++ gcc/cp/tree.c	(working copy)
@@ -937,9 +937,12 @@ array_of_runtime_bound_p (tree t)
   tree dom = TYPE_DOMAIN (t);
   if (!dom)
     return false;
-  tree max = TYPE_MAX_VALUE (dom);
-  return (!potential_rvalue_constant_expression (max)
-	  || (!value_dependent_expression_p (max) && !TREE_CONSTANT (max)));
+  if (tree max = TYPE_MAX_VALUE (dom))
+    return (!potential_rvalue_constant_expression (max)
+	    || (!value_dependent_expression_p (max) && !TREE_CONSTANT (max)));
+
+  /* Flexible array members have no upper bound.  */
+  return false;
 }
 
 /* Return a reference type node referring to TO_TYPE.  If RVAL is
Index: gcc/testsuite/g++.dg/ext/flexary12.C
===================================================================
--- gcc/testsuite/g++.dg/ext/flexary12.C	(revision 0)
+++ gcc/testsuite/g++.dg/ext/flexary12.C	(working copy)
@@ -0,0 +1,63 @@
+// PR c++/69290 - [6 Regression] g++ ICE on invalid initialization
+//     of a flexible array member
+// { dg-do compile }
+
+// Suppress pedantic errors about initialization of a flexible array member.
+// { dg-options "-Wno-pedantic" }
+
+struct A {
+  int a [];  // { dg-error "flexible array member .A::a. in an otherwise empty .struct A." }
+};
+
+void f1 ()
+{
+  // This is the meat of the test from c++/69290:
+  struct A a
+    = { "c" };   // { dg-error "invalid conversion from .const char\\*. to .int." }
+
+  (void)&a;
+}
+
+
+// Exercise other forms of invalid initialization besides the one in the bug.
+struct B {
+  int n;
+  int a [];
+};
+
+void f2 ()
+{
+  struct B b1
+    = { 0, "c" };   // { dg-error "invalid conversion from .const char\\*. to .int." }
+
+  (void)&b1;
+
+  const char s[] = "c";
+  struct B b2
+    = { 0, s };   // { dg-error "invalid conversion from .const char\\*. to .int." }
+
+  (void)&b2;
+}
+
+struct D {
+  int a [];  // { dg-error "flexible array member .D::a. in an otherwise empty .struct D." }
+  D ();
+};
+
+D::D ():
+  a ("c")   // { dg-error "incompatible types in assignment of .const char \\\[2\\\]. to .int \\\[\\\]." }
+{ }
+
+
+template <class T>
+struct C {
+  T a [];  // { dg-error "flexible array member" }
+};
+
+void f3 ()
+{
+  struct C<double> cd
+    = { "c" };   // { dg-error "cannot convert .const char\\*. to .double." }
+
+  (void)&cd;
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2016-01-21 22:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-21 22:55 [PATCH] #69290 - [6 Regression] ICE on invalid initialization of a flexible array member Martin Sebor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).