Commit 062c4bb3 by Joseph Myers Committed by Joseph Myers

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
parent 244c6ba0
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> 2009-02-03 Andrew Pinski <andrew_pinski@playstation.sony.com>
PR C++/36607 PR C++/36607
......
...@@ -4389,7 +4389,14 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -4389,7 +4389,14 @@ grokdeclarator (const struct c_declarator *declarator,
} }
else if (decl_context == FIELD) 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, pedwarn (input_location, OPT_pedantic,
"ISO C90 does not support flexible array members"); "ISO C90 does not support flexible array members");
...@@ -4401,12 +4408,6 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -4401,12 +4408,6 @@ grokdeclarator (const struct c_declarator *declarator,
{ {
if (array_parm_vla_unspec_p) 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); itype = build_range_type (sizetype, size_zero_node, NULL_TREE);
size_varies = 1; size_varies = 1;
} }
...@@ -4415,12 +4416,14 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -4415,12 +4416,14 @@ grokdeclarator (const struct c_declarator *declarator,
{ {
if (array_parm_vla_unspec_p) if (array_parm_vla_unspec_p)
{ {
/* The error is printed elsewhere. We use this to /* C99 6.7.5.2p4 */
avoid messing up with incomplete array types of warning (0, "%<[*]%> not in a declaration");
the same type, that would otherwise be modified /* We use this to avoid messing up with incomplete
below. */ array types of the same type, that would
otherwise be modified below. */
itype = build_range_type (sizetype, size_zero_node, itype = build_range_type (sizetype, size_zero_node,
NULL_TREE); NULL_TREE);
size_varies = 1;
} }
} }
......
...@@ -4949,13 +4949,6 @@ c_parser_sizeof_expression (c_parser *parser) ...@@ -4949,13 +4949,6 @@ c_parser_sizeof_expression (c_parser *parser)
/* sizeof ( type-name ). */ /* sizeof ( type-name ). */
skip_evaluation--; skip_evaluation--;
in_sizeof--; 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); return c_expr_sizeof_type (type_name);
} }
else else
......
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> 2009-02-03 Jason Merrill <jason@redhat.com>
* g++.dg/warn/main-4.C: New test. * g++.dg/warn/main-4.C: New test.
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
void foo0 (int a, int b[*]); /* { dg-error "ISO C90" "\[*\] not in C90" } */ void foo0 (int a, int b[*]); /* { dg-error "ISO C90" "\[*\] not in C90" } */
void foo1 (int, int [*]); /* { 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) /* Use of static and type qualifiers (not allowed with abstract declarators)
is a C99 feature. */ is a C99 feature. */
......
/* 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 } */
...@@ -7,9 +7,12 @@ int foo3(int i)[*]; /* { dg-error "not allowed in other than function prototype ...@@ -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 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" } */ 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 */ /* [*] can't be used in a type that's not a declaration (maybe, the
void foo11(int x[sizeof(int (*)[*])]); /* { dg-error "not allowed in other than a declaration" } */ final wording for DR#341 would allow it although the first
void foo12(int [*]); /* { dg-error "not allowed in other than a declaration" } */ 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; extern int n;
int B[100]; int B[100];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment