Hello!

With invalid code, we can trick grokdeclarator to return VAR_DECL,
even when FUNCDEF context is requested. Attached one-liner detects
this situation and exits early from start_function. The new error
stream looks correct to me, with following invalid testcase we get:

$ cat pr52290.c
int f()[j]

$ ~/gcc-build-fast/gcc/cc1 pr52290.c
pr52290.c:3:9: error: ‘j’ undeclared here (not in a function)
pr52290.c:3:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’
at end of input

2012-02-23  Uros Bizjak  <ubiz...@gmail.com>

        * c-decl.c (start_function): Exit early if decl1 is not FUNTION_DECL.

testsuite/ChangeLog:

2012-02-23  Uros Bizjak  <ubiz...@gmail.com>

        * gcc.dg/noncompile/pr52290.c: New test.

Patch was bootstrapped and regression tested on x86_64-pc-linux-gnu.

OK for mainline and release branches?

Uros.
Index: c-decl.c
===================================================================
--- c-decl.c    (revision 184501)
+++ c-decl.c    (working copy)
@@ -7702,7 +7702,8 @@ start_function (struct c_declspecs *declspecs, str
 
   /* If the declarator is not suitable for a function definition,
      cause a syntax error.  */
-  if (decl1 == 0)
+  if (decl1 == 0
+      || TREE_CODE (decl1) != FUNCTION_DECL)
     return 0;
 
   loc = DECL_SOURCE_LOCATION (decl1);
Index: testsuite/gcc.dg/noncompile/pr52290.c
===================================================================
--- testsuite/gcc.dg/noncompile/pr52290.c       (revision 0)
+++ testsuite/gcc.dg/noncompile/pr52290.c       (revision 0)
@@ -0,0 +1,3 @@
+/* { dg-error "undeclared here" "" { target *-*-* } 3 } */
+/* { dg-error "expected" "" { target *-*-* } 3 } */
+int f()[j]

Reply via email to