re PR c/29129 ([DR#341] unnamed parameters using [*])

PR c/29129
	* c-decl.c (grokdeclarator): Mark [*] arrays in field declarators
	as having variable size.  Do not give an error for unnamed
	parameters with [*] declarators.  Give a warning for type names
	with [*] declarators and mark them as variable size.
	* c-parser.c (c_parser_sizeof_expression): Do not give an error
	for sizeof applied to [*] type names.

testsuite:
	* c90-arraydecl-1.c: Do not expect error for [*] in abstract
	declarator.
	* vla-6.c: Likewise.  Expect warning not error for [*] lexically
	inside function prototype but not part of parameter declarator.
	* vla-11.c: New test.

From-SVN: r143918
This commit is contained in:
Joseph Myers 2009-02-04 00:59:21 +00:00 committed by Joseph Myers
parent 244c6ba0d3
commit 062c4bb37a
7 changed files with 53 additions and 22 deletions

View File

@ -1,3 +1,13 @@
2009-02-03 Joseph Myers <joseph@codesourcery.com>
PR c/29129
* c-decl.c (grokdeclarator): Mark [*] arrays in field declarators
as having variable size. Do not give an error for unnamed
parameters with [*] declarators. Give a warning for type names
with [*] declarators and mark them as variable size.
* c-parser.c (c_parser_sizeof_expression): Do not give an error
for sizeof applied to [*] type names.
2009-02-03 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR C++/36607

View File

@ -4389,7 +4389,14 @@ grokdeclarator (const struct c_declarator *declarator,
}
else if (decl_context == FIELD)
{
if (pedantic && !flag_isoc99 && !in_system_header)
if (array_parm_vla_unspec_p)
/* Field names can in fact have function prototype
scope so [*] is disallowed here through making
the field variably modified, not through being
something other than a declaration with function
prototype scope. */
size_varies = 1;
else if (pedantic && !flag_isoc99 && !in_system_header)
pedwarn (input_location, OPT_pedantic,
"ISO C90 does not support flexible array members");
@ -4401,12 +4408,6 @@ grokdeclarator (const struct c_declarator *declarator,
{
if (array_parm_vla_unspec_p)
{
if (! orig_name)
{
/* C99 6.7.5.2p4 */
error ("%<[*]%> not allowed in other than a declaration");
}
itype = build_range_type (sizetype, size_zero_node, NULL_TREE);
size_varies = 1;
}
@ -4415,12 +4416,14 @@ grokdeclarator (const struct c_declarator *declarator,
{
if (array_parm_vla_unspec_p)
{
/* The error is printed elsewhere. We use this to
avoid messing up with incomplete array types of
the same type, that would otherwise be modified
below. */
/* C99 6.7.5.2p4 */
warning (0, "%<[*]%> not in a declaration");
/* We use this to avoid messing up with incomplete
array types of the same type, that would
otherwise be modified below. */
itype = build_range_type (sizetype, size_zero_node,
NULL_TREE);
size_varies = 1;
}
}

View File

@ -4949,13 +4949,6 @@ c_parser_sizeof_expression (c_parser *parser)
/* sizeof ( type-name ). */
skip_evaluation--;
in_sizeof--;
if (type_name->declarator->kind == cdk_array
&& type_name->declarator->u.array.vla_unspec_p)
{
/* C99 6.7.5.2p4 */
error_at (expr_loc,
"%<[*]%> not allowed in other than a declaration");
}
return c_expr_sizeof_type (type_name);
}
else

View File

@ -1,3 +1,12 @@
2009-02-03 Joseph Myers <joseph@codesourcery.com>
PR c/29129
* c90-arraydecl-1.c: Do not expect error for [*] in abstract
declarator.
* vla-6.c: Likewise. Expect warning not error for [*] lexically
inside function prototype but not part of parameter declarator.
* vla-11.c: New test.
2009-02-03 Jason Merrill <jason@redhat.com>
* g++.dg/warn/main-4.C: New test.

View File

@ -10,7 +10,7 @@
void foo0 (int a, int b[*]); /* { dg-error "ISO C90" "\[*\] not in C90" } */
void foo1 (int, int [*]); /* { dg-error "ISO C90" "\[*\] not in C90" } */
/* { dg-error "allowed" "\'\[*\]\' not allowed in other than a declaration" { target *-*-* } 12 } */
/* Use of static and type qualifiers (not allowed with abstract declarators)
is a C99 feature. */

View File

@ -0,0 +1,13 @@
/* Further tests of [*] being rejected other that in declarations, as
per the consensus in DR#341 that the second example there should be
invalid (but warnings because the final wording appears to allow
these cases). */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
/* { dg-do compile } */
/* { dg-options "-std=c99 -pedantic-errors" } */
void foo11a(int x[sizeof(int *(*)[*])]); /* { dg-warning "not in a declaration" } */
void foo11b(__SIZE_TYPE__ x, int y[(__SIZE_TYPE__)(int (*)[*])x]); /* { dg-warning "not in a declaration" } */
void foo11c(struct s { int (*x)[*]; } *y); /* { dg-error "a member of a structure or union cannot have a variably modified type" "variably modified" } */
/* { dg-warning "'struct s' declared inside parameter list" "struct decl" { target *-*-* } 11 } */
/* { dg-warning "its scope is only this definition or declaration" "struct scope" { target *-*-* } 11 } */

View File

@ -7,9 +7,12 @@ int foo3(int i)[*]; /* { dg-error "not allowed in other than function prototype
void foo4(int o[*][4]) { } /* { dg-error "not allowed in other than function prototype scope" } */
void foo5(int o[4][*]) { } /* { dg-error "not allowed in other than function prototype scope" } */
/* [*] can't be used in a type that's not a declaration */
void foo11(int x[sizeof(int (*)[*])]); /* { dg-error "not allowed in other than a declaration" } */
void foo12(int [*]); /* { dg-error "not allowed in other than a declaration" } */
/* [*] can't be used in a type that's not a declaration (maybe, the
final wording for DR#341 would allow it although the first
discussed intent would not). */
void foo11(int x[sizeof(int (*)[*])]); /* { dg-warning "not in a declaration" } */
/* This case is allowed per DR#341. */
void foo12(int [*]);
extern int n;
int B[100];