Commit 6ac0194d by Joseph Myers Committed by Joseph Myers

re PR c/14050 ([DR289] c99 restrict doesn't work in abs declarator)

	PR c/14050
	* c-decl.c (set_array_declarator_inner): Don't give error for
	static or type qualifiers in abstract declarator.  Remove
	abstract_p parameter.
	* c-tree.h (set_array_declarator_inner): Update prototype.
	* c-parser.c (c_parser_direct_declarator_inner): Update call to
	set_array_declarator_inner.
	* doc/standards.texi: Update for C99 TC3.

testsuite:
	* gcc.dg/c99-arraydecl-1.c: Don't expect errors for static or type
	qualifiers in abstract declarator.

From-SVN: r130362
parent df870236
2007-11-22 Joseph Myers <joseph@codesourcery.com>
PR c/14050
* c-decl.c (set_array_declarator_inner): Don't give error for
static or type qualifiers in abstract declarator. Remove
abstract_p parameter.
* c-tree.h (set_array_declarator_inner): Update prototype.
* c-parser.c (c_parser_direct_declarator_inner): Update call to
set_array_declarator_inner.
* doc/standards.texi: Update for C99 TC3.
2007-11-22 Hans-Peter Nilsson <hp@bitrange.com> 2007-11-22 Hans-Peter Nilsson <hp@bitrange.com>
* config/mmix/mmix.c (mmix_encode_section_info): Remove duplicate * config/mmix/mmix.c (mmix_encode_section_info): Remove duplicate
...@@ -3081,20 +3081,13 @@ build_array_declarator (tree expr, struct c_declspecs *quals, bool static_p, ...@@ -3081,20 +3081,13 @@ build_array_declarator (tree expr, struct c_declspecs *quals, bool static_p,
/* Set the contained declarator of an array declarator. DECL is the /* Set the contained declarator of an array declarator. DECL is the
declarator, as constructed by build_array_declarator; INNER is what declarator, as constructed by build_array_declarator; INNER is what
appears on the left of the []. ABSTRACT_P is true if it is an appears on the left of the []. */
abstract declarator, false otherwise; this is used to reject static
and type qualifiers in abstract declarators, where they are not in
the C99 grammar (subject to possible change in DR#289). */
struct c_declarator * struct c_declarator *
set_array_declarator_inner (struct c_declarator *decl, set_array_declarator_inner (struct c_declarator *decl,
struct c_declarator *inner, bool abstract_p) struct c_declarator *inner)
{ {
decl->declarator = inner; decl->declarator = inner;
if (abstract_p && (decl->u.array.quals != TYPE_UNQUALIFIED
|| decl->u.array.attrs != NULL_TREE
|| decl->u.array.static_p))
error ("static or type qualifiers in abstract declarator");
return decl; return decl;
} }
......
...@@ -2499,7 +2499,7 @@ c_parser_direct_declarator_inner (c_parser *parser, bool id_present, ...@@ -2499,7 +2499,7 @@ c_parser_direct_declarator_inner (c_parser *parser, bool id_present,
star_seen); star_seen);
if (declarator == NULL) if (declarator == NULL)
return NULL; return NULL;
inner = set_array_declarator_inner (declarator, inner, !id_present); inner = set_array_declarator_inner (declarator, inner);
return c_parser_direct_declarator_inner (parser, id_present, inner); return c_parser_direct_declarator_inner (parser, id_present, inner);
} }
else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
......
...@@ -487,8 +487,7 @@ extern void c_push_function_context (struct function *); ...@@ -487,8 +487,7 @@ extern void c_push_function_context (struct function *);
extern void c_pop_function_context (struct function *); extern void c_pop_function_context (struct function *);
extern void push_parm_decl (const struct c_parm *); extern void push_parm_decl (const struct c_parm *);
extern struct c_declarator *set_array_declarator_inner (struct c_declarator *, extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
struct c_declarator *, struct c_declarator *);
bool);
extern tree c_builtin_function (tree); extern tree c_builtin_function (tree);
extern void shadow_tag (const struct c_declspecs *); extern void shadow_tag (const struct c_declspecs *);
extern void shadow_tag_warned (const struct c_declspecs *, int); extern void shadow_tag_warned (const struct c_declspecs *, int);
......
...@@ -37,6 +37,8 @@ with some exceptions, and possibly with some extensions. ...@@ -37,6 +37,8 @@ with some exceptions, and possibly with some extensions.
@cindex Technical Corrigendum 1 @cindex Technical Corrigendum 1
@cindex TC2 @cindex TC2
@cindex Technical Corrigendum 2 @cindex Technical Corrigendum 2
@cindex TC3
@cindex Technical Corrigendum 3
@cindex AMD1 @cindex AMD1
@cindex freestanding implementation @cindex freestanding implementation
@cindex freestanding environment @cindex freestanding environment
...@@ -86,9 +88,9 @@ standard, use @option{-std=c99} or @option{-std=iso9899:1999}. (While in ...@@ -86,9 +88,9 @@ standard, use @option{-std=c99} or @option{-std=iso9899:1999}. (While in
development, drafts of this standard version were referred to as development, drafts of this standard version were referred to as
@dfn{C9X}.) @dfn{C9X}.)
Errors in the 1999 ISO C standard were corrected in two Technical Errors in the 1999 ISO C standard were corrected in three Technical
Corrigenda published in 2001 and 2004. GCC does not support the uncorrected Corrigenda published in 2001, 2004 and 2007. GCC does not support the
version. uncorrected version.
By default, GCC provides some extensions to the C language that on By default, GCC provides some extensions to the C language that on
rare occasions conflict with the C standard. @xref{C rare occasions conflict with the C standard. @xref{C
......
2007-11-22 Joseph Myers <joseph@codesourcery.com>
PR c/14050
* gcc.dg/c99-arraydecl-1.c: Don't expect errors for static or type
qualifiers in abstract declarator.
2007-11-22 Tobias Burnus <burnus@net-b.de> 2007-11-22 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/derived_constructor_comps_3.f90: New. * gfortran.dg/derived_constructor_comps_3.f90: New.
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
[quals static expr]. Not yet: [quals *]. */ [quals static expr]. Not yet: [quals *]. */
void f00 (int a[const]); void f00 (int a[const]);
void f01 (int [const]); /* { dg-bogus "warning" "warning in place of error" } */ void f01 (int [const]);
/* { dg-error "abstract" "\[quals\] in abstract declarator" { target *-*-* } 12 } */
void void
f02 (int a[const]) f02 (int a[const])
{ {
...@@ -28,8 +28,8 @@ f03 (a) ...@@ -28,8 +28,8 @@ f03 (a)
} }
void f10 (int a[const 2]); void f10 (int a[const 2]);
void f11 (int [const 2]); /* { dg-bogus "warning" "warning in place of error" } */ void f11 (int [const 2]);
/* { dg-error "abstract" "\[quals expr\] in abstract declarator" { target *-*-* } 31 } */
void void
f12 (int a[const 2]) f12 (int a[const 2])
{ {
...@@ -47,8 +47,8 @@ f13 (a) ...@@ -47,8 +47,8 @@ f13 (a)
} }
void f20 (int a[static 2]); void f20 (int a[static 2]);
void f21 (int [static 2]); /* { dg-bogus "warning" "warning in place of error" } */ void f21 (int [static 2]);
/* { dg-error "abstract" "\[static expr\] in abstract declarator" { target *-*-* } 50 } */
void void
f22 (int a[static 2]) f22 (int a[static 2])
{ {
...@@ -64,8 +64,8 @@ f23 (a) ...@@ -64,8 +64,8 @@ f23 (a)
} }
void f30 (int a[static const 2]); void f30 (int a[static const 2]);
void f31 (int [static const 2]); /* { dg-bogus "warning" "warning in place of error" } */ void f31 (int [static const 2]);
/* { dg-error "abstract" "\[static quals expr\] in abstract declarator" { target *-*-* } 67 } */
void void
f32 (int a[static const 2]) f32 (int a[static const 2])
{ {
...@@ -83,8 +83,8 @@ f33 (a) ...@@ -83,8 +83,8 @@ f33 (a)
} }
void f40 (int a[const static 2]); void f40 (int a[const static 2]);
void f41 (int [const static 2]); /* { dg-bogus "warning" "warning in place of error" } */ void f41 (int [const static 2]);
/* { dg-error "abstract" "\[quals static expr\] in abstract declarator" { target *-*-* } 86 } */
void void
f42 (int a[const static 2]) f42 (int a[const static 2])
{ {
......
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