aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-parse.in
diff options
context:
space:
mode:
authorJoseph Myers <jsm@polyomino.org.uk>2004-10-14 01:34:01 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2004-10-14 01:34:01 +0100
commit81da229b08e74978a0dfb5bca48138a0a4a2357c (patch)
treed480ea1c4408842eab54602e3d430ca39cc2a0b7 /gcc/c-parse.in
parent599a049f76abea81f4e5534520529aa9f5fadf0d (diff)
downloadgcc-81da229b08e74978a0dfb5bca48138a0a4a2357c.zip
gcc-81da229b08e74978a0dfb5bca48138a0a4a2357c.tar.gz
gcc-81da229b08e74978a0dfb5bca48138a0a4a2357c.tar.bz2
c-tree.h (enum c_typespec_kind, [...]): New.
* c-tree.h (enum c_typespec_kind, struct c_typespec, parser_xref_tag): New. (struct c_declspecs): Add tag_defined_p. Adjust definition of typedef_p. (declspecs_add_type): Adjust prototypes. * c-parse.in (%union): Add tstype. (typespec_nonattr, typespec_attr, typespec_reserved_nonattr, typespec_reserved_attr, typespec_nonreserved_nonattr, structsp_attr, structsp_nonattr): Change to tstype. Update actions. * c-decl.c (build_null_declspecs): Initialize tag_defined_p. (declspecs_add_type): Update to take struct c_typespec argument. Set tag_defined_p and typedef_p as appropriate. (xref_tag): Rename to parser_xref_tag and replace by wrapper. Update to return struct c_typespec. (shadow_tag_warned): Don't let empty declarations with qualifiers or storage class specifiers redeclare a tag if a previous declaration is visible. testsuite: * gcc.dg/c99-tag-3.c, gcc.dg/declspec-14.c: New tests. From-SVN: r89021
Diffstat (limited to 'gcc/c-parse.in')
-rw-r--r--gcc/c-parse.in90
1 files changed, 55 insertions, 35 deletions
diff --git a/gcc/c-parse.in b/gcc/c-parse.in
index e469677..7542c39 100644
--- a/gcc/c-parse.in
+++ b/gcc/c-parse.in
@@ -101,8 +101,8 @@ do { \
%union {long itype; tree ttype; void *otype; struct c_expr exprtype;
struct c_arg_info *arginfotype; struct c_declarator *dtrtype;
struct c_type_name *typenametype; struct c_parm *parmtype;
- struct c_declspecs *dsptype; enum tree_code code;
- location_t location; }
+ struct c_declspecs *dsptype; struct c_typespec tstype;
+ enum tree_code code; location_t location; }
/* All identifiers that are not reserved words
and are not declared typedefs in the current block */
@@ -202,9 +202,9 @@ do { \
%type <dsptype> declspecs_ts_nosa declspecs_nots_nosa
%type <dsptype> declspecs_nosc_ts declspecs_nosc_nots declspecs_nosc declspecs
%type <dsptype> maybe_type_quals_attrs
-%type <ttype> typespec_nonattr typespec_attr
-%type <ttype> typespec_reserved_nonattr typespec_reserved_attr
-%type <ttype> typespec_nonreserved_nonattr
+%type <tstype> typespec_nonattr typespec_attr
+%type <tstype> typespec_reserved_nonattr typespec_reserved_attr
+%type <tstype> typespec_nonreserved_nonattr
%type <ttype> offsetof_member_designator
%type <ttype> scspec SCSPEC STATIC TYPESPEC TYPE_QUAL maybe_volatile
@@ -226,7 +226,7 @@ do { \
%type <dtrtype> parm_declarator_starttypename parm_declarator_nostarttypename
%type <dtrtype> array_declarator
-%type <ttype> structsp_attr structsp_nonattr
+%type <tstype> structsp_attr structsp_nonattr
%type <ttype> component_decl_list component_decl_list2
%type <ttype> component_decl components components_notype component_declarator
%type <ttype> component_notype_declarator
@@ -1262,7 +1262,9 @@ typespec_attr:
typespec_reserved_nonattr:
TYPESPEC
- { OBJC_NEED_RAW_IDENTIFIER (1); }
+ { OBJC_NEED_RAW_IDENTIFIER (1);
+ $$.kind = ctsk_resword;
+ $$.spec = $1; }
| structsp_nonattr
;
@@ -1274,17 +1276,21 @@ typespec_nonreserved_nonattr:
TYPENAME
{ /* For a typedef name, record the meaning, not the name.
In case of `foo foo, bar;'. */
- $$ = lookup_name ($1); }
+ $$.kind = ctsk_typedef;
+ $$.spec = lookup_name ($1); }
@@ifobjc
| CLASSNAME protocolrefs
- { $$ = objc_get_protocol_qualified_type ($1, $2); }
+ { $$.kind = ctsk_objc;
+ $$.spec = objc_get_protocol_qualified_type ($1, $2); }
| OBJECTNAME protocolrefs
- { $$ = objc_get_protocol_qualified_type ($1, $2); }
+ { $$.kind = ctsk_objc;
+ $$.spec = objc_get_protocol_qualified_type ($1, $2); }
/* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>"
- nisse@lysator.liu.se */
| non_empty_protocolrefs
- { $$ = objc_get_protocol_qualified_type (NULL_TREE, $1); }
+ { $$.kind = ctsk_objc;
+ $$.spec = objc_get_protocol_qualified_type (NULL_TREE, $1); }
@@end_ifobjc
| typeof '(' expr ')'
{ skip_evaluation--;
@@ -1292,11 +1298,17 @@ typespec_nonreserved_nonattr:
if (TREE_CODE ($3.value) == COMPONENT_REF
&& DECL_C_BIT_FIELD (TREE_OPERAND ($3.value, 1)))
error ("%<typeof%> applied to a bit-field");
- $$ = TREE_TYPE ($3.value);
- pop_maybe_used (variably_modified_type_p ($$, NULL_TREE)); }
+ $$.kind = ctsk_typeof;
+ $$.spec = TREE_TYPE ($3.value);
+ pop_maybe_used (variably_modified_type_p ($$.spec,
+ NULL_TREE)); }
| typeof '(' typename ')'
- { skip_evaluation--; in_typeof--; $$ = groktypename ($3);
- pop_maybe_used (variably_modified_type_p ($$, NULL_TREE)); }
+ { skip_evaluation--;
+ in_typeof--;
+ $$.kind = ctsk_typeof;
+ $$.spec = groktypename ($3);
+ pop_maybe_used (variably_modified_type_p ($$.spec,
+ NULL_TREE)); }
;
/* typespec_nonreserved_attr does not exist. */
@@ -1639,47 +1651,55 @@ enum_head:
structsp_attr:
struct_head identifier '{'
- { $$ = start_struct (RECORD_TYPE, $2);
+ { $<ttype>$ = start_struct (RECORD_TYPE, $2);
/* Start scope of tag before parsing components. */
}
component_decl_list '}' maybe_attribute
- { $$ = finish_struct ($<ttype>4, nreverse ($5),
- chainon ($1, $7)); }
+ { $$.spec = finish_struct ($<ttype>4, nreverse ($5),
+ chainon ($1, $7));
+ $$.kind = ctsk_tagdef; }
| struct_head '{' component_decl_list '}' maybe_attribute
- { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),
- nreverse ($3), chainon ($1, $5));
+ { $$.spec = finish_struct (start_struct (RECORD_TYPE,
+ NULL_TREE),
+ nreverse ($3), chainon ($1, $5));
+ $$.kind = ctsk_tagdef;
}
| union_head identifier '{'
- { $$ = start_struct (UNION_TYPE, $2); }
+ { $<ttype>$ = start_struct (UNION_TYPE, $2); }
component_decl_list '}' maybe_attribute
- { $$ = finish_struct ($<ttype>4, nreverse ($5),
- chainon ($1, $7)); }
+ { $$.spec = finish_struct ($<ttype>4, nreverse ($5),
+ chainon ($1, $7));
+ $$.kind = ctsk_tagdef; }
| union_head '{' component_decl_list '}' maybe_attribute
- { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE),
- nreverse ($3), chainon ($1, $5));
+ { $$.spec = finish_struct (start_struct (UNION_TYPE,
+ NULL_TREE),
+ nreverse ($3), chainon ($1, $5));
+ $$.kind = ctsk_tagdef;
}
| enum_head identifier '{'
- { $$ = start_enum ($2); }
+ { $<ttype>$ = start_enum ($2); }
enumlist maybecomma_warn '}' maybe_attribute
- { $$ = finish_enum ($<ttype>4, nreverse ($5),
- chainon ($1, $8)); }
+ { $$.spec = finish_enum ($<ttype>4, nreverse ($5),
+ chainon ($1, $8));
+ $$.kind = ctsk_tagdef; }
| enum_head '{'
- { $$ = start_enum (NULL_TREE); }
+ { $<ttype>$ = start_enum (NULL_TREE); }
enumlist maybecomma_warn '}' maybe_attribute
- { $$ = finish_enum ($<ttype>3, nreverse ($4),
- chainon ($1, $7)); }
+ { $$.spec = finish_enum ($<ttype>3, nreverse ($4),
+ chainon ($1, $7));
+ $$.kind = ctsk_tagdef; }
;
structsp_nonattr:
struct_head identifier
- { $$ = xref_tag (RECORD_TYPE, $2); }
+ { $$ = parser_xref_tag (RECORD_TYPE, $2); }
| union_head identifier
- { $$ = xref_tag (UNION_TYPE, $2); }
+ { $$ = parser_xref_tag (UNION_TYPE, $2); }
| enum_head identifier
- { $$ = xref_tag (ENUMERAL_TYPE, $2);
+ { $$ = parser_xref_tag (ENUMERAL_TYPE, $2);
/* In ISO C, enumerated types can be referred to
only if already defined. */
- if (pedantic && !COMPLETE_TYPE_P ($$))
+ if (pedantic && !COMPLETE_TYPE_P ($$.spec))
pedwarn ("ISO C forbids forward references to %<enum%> types"); }
;