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]