Diagnose use of [*] in old-style parameter definitions (PR c/88704).

GCC wrongly accepts [*] in old-style parameter definitions because
because parm_flag is set on the scope used for those definitions and,
unlike the case of a prototype in a function definition, there is no
subsequent check to disallow this invalid usage.  This patch adds such
a check.  (At this point we don't have location information for the
[*], so the diagnostic location isn't ideal.)

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

	PR c/88704
gcc/c:
	* c-decl.c (store_parm_decls_oldstyle): Diagnose use of [*] in
	old-style parameter definitions.

gcc/testsuite:
	* gcc.dg/vla-25.c: New test.

From-SVN: r278917
This commit is contained in:
Joseph Myers 2019-12-03 01:27:43 +00:00 committed by Joseph Myers
parent b650026dff
commit 85d1195708
4 changed files with 23 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2019-12-03 Joseph Myers <joseph@codesourcery.com>
PR c/88704
* c-decl.c (store_parm_decls_oldstyle): Diagnose use of [*] in
old-style parameter definitions.
2019-12-01 Sandra Loosemore <sandra@codesourcery.com> 2019-12-01 Sandra Loosemore <sandra@codesourcery.com>
PR target/92499 PR target/92499

View File

@ -9394,6 +9394,9 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
"old-style function definition"); "old-style function definition");
} }
if (current_scope->had_vla_unspec)
error ("%<[*]%> not allowed in other than function prototype scope");
/* Match each formal parameter name with its declaration. Save each /* Match each formal parameter name with its declaration. Save each
decl in the appropriate TREE_PURPOSE slot of the parmids chain. */ decl in the appropriate TREE_PURPOSE slot of the parmids chain. */
for (parm = parmids; parm; parm = TREE_CHAIN (parm)) for (parm = parmids; parm; parm = TREE_CHAIN (parm))

View File

@ -1,3 +1,8 @@
2019-12-03 Joseph Myers <joseph@codesourcery.com>
PR c/88704
* gcc.dg/vla-25.c: New test.
2019-12-03 Jakub Jelinek <jakub@redhat.com> 2019-12-03 Jakub Jelinek <jakub@redhat.com>
* g++.dg/lto/inline-crossmodule-1_0.C: Use -fdump-ipa-inline-details * g++.dg/lto/inline-crossmodule-1_0.C: Use -fdump-ipa-inline-details

View File

@ -0,0 +1,9 @@
/* Test [*] diagnosed on old-style parameter declaration. PR c/88704. */
/* { dg-do compile } */
/* { dg-options "-std=c99 -pedantic-errors" } */
void
f (x)
int x[*];
{ /* { dg-error "not allowed in other than function prototype scope" } */
}