diff mbox series

avoid erroneous VLA bounds (PR 100550)

Message ID 2b86b3c7-ff39-bbea-cd69-613537b9e26f@gmail.com
State New
Headers show
Series avoid erroneous VLA bounds (PR 100550) | expand

Commit Message

Martin Sebor May 13, 2021, 12:05 a.m. UTC
An erroneous VLA parameter bound in a function redeclaration causes
an ICE as the -Wvla-parameter is trying to format a diagnostic after
an error has already been issued.  The attached change prevents
such parameters from being considered.

This patch is for trunk and GCC 11.

Martin

Comments

Joseph Myers May 13, 2021, 12:23 a.m. UTC | #1
On Wed, 12 May 2021, Martin Sebor via Gcc-patches wrote:

> An erroneous VLA parameter bound in a function redeclaration causes
> an ICE as the -Wvla-parameter is trying to format a diagnostic after
> an error has already been issued.  The attached change prevents
> such parameters from being considered.

OK.
diff mbox series

Patch

PR c/100550 - ICE: in fold_convert_loc with function call VLA argument

gcc/c/ChangeLog:

	PR c/100550
	* c-decl.c (get_parm_array_spec): Avoid erroneous VLA bounds.

gcc/testsuite/ChangeLog:

	PR c/100550
	* gcc.dg/Wvla-parameter-9.c: New test.

diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 3ea4708c507..53b2b5b637d 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -5856,6 +5856,9 @@  get_parm_array_spec (const struct c_parm *parm, tree attrs)
 	  spec += buf;
 	  break;
 	}
+      else if (!INTEGRAL_TYPE_P (TREE_TYPE (nelts)))
+	/* Avoid invalid NELTS.  */
+	return attrs;
 
       /* Each variable VLA bound is represented by a dollar sign.  */
       spec += "$";
diff --git a/gcc/testsuite/gcc.dg/Wvla-parameter-9.c b/gcc/testsuite/gcc.dg/Wvla-parameter-9.c
new file mode 100644
index 00000000000..6c8987a34eb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wvla-parameter-9.c
@@ -0,0 +1,30 @@ 
+/* PR c/100550 - ICE: in fold_convert_loc with function call VLA argument
+   { dg-do compile }
+   { dg-options "-Wall" } */
+
+struct S { int i; };
+
+extern void v;
+extern void *pv;
+extern struct S s;
+void vf (void);
+
+/* Verify that a function redeclaration with an invalid VLA doesn't ICE.  */
+
+void f0 (int[]);
+void f0 (int[undeclared]);    // { dg-error "undeclared" }
+
+void f1 (int[]);
+void f1 (int[-1]);            // { dg-error "size" }
+
+void f2 (int[]);
+void f2 (int[v]);             // { dg-error "size" }
+
+void f3 (int[]);
+void f3 (int b[s]);           // { dg-error "size" }
+
+void f4 (int[]);
+void f4 (int c[pv]);          // { dg-error "size" }
+
+void f5 (int[]);
+void f5 (int d[vf ()]);       // { dg-error "size" }