Commit 34724814 by Richard Kenner

New rules to allow attributes in a prefix position.

From-SVN: r8995
parent 4b4e3407
...@@ -30,7 +30,7 @@ ifobjc ...@@ -30,7 +30,7 @@ ifobjc
%expect 22 %expect 22
end ifobjc end ifobjc
ifc ifc
%expect 10 %expect 23
/* These are the 10 conflicts you should get in parse.output; /* These are the 10 conflicts you should get in parse.output;
the state numbers may vary if minor changes in the grammar are made. the state numbers may vary if minor changes in the grammar are made.
...@@ -227,6 +227,7 @@ static int if_stmt_line; ...@@ -227,6 +227,7 @@ static int if_stmt_line;
/* List of types and structure classes of the current declaration. */ /* List of types and structure classes of the current declaration. */
static tree current_declspecs; static tree current_declspecs;
static tree prefix_attributes = NULL_TREE;
/* Stack of saved values of current_declspecs. */ /* Stack of saved values of current_declspecs. */
static tree declspec_stack; static tree declspec_stack;
...@@ -879,7 +880,12 @@ setspecs: /* empty */ ...@@ -879,7 +880,12 @@ setspecs: /* empty */
pending_xref_error (); pending_xref_error ();
declspec_stack = tree_cons (NULL_TREE, current_declspecs, declspec_stack = tree_cons (NULL_TREE, current_declspecs,
declspec_stack); declspec_stack);
current_declspecs = $<ttype>0; } current_declspecs = $<ttype>0;
prefix_attributes = NULL_TREE; }
;
setattrs: /* empty */
{ prefix_attributes = $<ttype>0; }
; ;
decl: decl:
...@@ -1017,32 +1023,33 @@ maybeasm: ...@@ -1017,32 +1023,33 @@ maybeasm:
initdcl: initdcl:
declarator maybeasm maybe_attribute '=' declarator maybeasm maybe_attribute '='
{ $<ttype>$ = start_decl ($1, current_declspecs, 1); { $<ttype>$ = start_decl ($1, current_declspecs, 1);
decl_attributes ($<ttype>$, $3); decl_attributes ($<ttype>$, $3, prefix_attributes);
start_init ($<ttype>$, $2, global_bindings_p ()); } start_init ($<ttype>$, $2, global_bindings_p ()); }
init init
/* Note how the declaration of the variable is in effect while its init is parsed! */ /* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_init (); { finish_init ();
decl_attributes ($<ttype>5, $3); decl_attributes ($<ttype>5, $3, prefix_attributes);
finish_decl ($<ttype>5, $6, $2); } finish_decl ($<ttype>5, $6, $2); }
| declarator maybeasm maybe_attribute | declarator maybeasm maybe_attribute
{ tree d = start_decl ($1, current_declspecs, 0); { tree d = start_decl ($1, current_declspecs, 0);
decl_attributes (d, $3); decl_attributes (d, $3, prefix_attributes);
finish_decl (d, NULL_TREE, $2); } finish_decl (d, NULL_TREE, $2);
}
; ;
notype_initdcl: notype_initdcl:
notype_declarator maybeasm maybe_attribute '=' notype_declarator maybeasm maybe_attribute '='
{ $<ttype>$ = start_decl ($1, current_declspecs, 1); { $<ttype>$ = start_decl ($1, current_declspecs, 1);
decl_attributes ($<ttype>$, $3); decl_attributes ($<ttype>$, $3, prefix_attributes);
start_init ($<ttype>$, $2, global_bindings_p ()); } start_init ($<ttype>$, $2, global_bindings_p ()); }
init init
/* Note how the declaration of the variable is in effect while its init is parsed! */ /* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_init (); { finish_init ();
decl_attributes ($<ttype>5, $3); decl_attributes ($<ttype>5, $3, prefix_attributes);
finish_decl ($<ttype>5, $6, $2); } finish_decl ($<ttype>5, $6, $2); }
| notype_declarator maybeasm maybe_attribute | notype_declarator maybeasm maybe_attribute
{ tree d = start_decl ($1, current_declspecs, 0); { tree d = start_decl ($1, current_declspecs, 0);
decl_attributes (d, $3); decl_attributes (d, $3, prefix_attributes);
finish_decl (d, NULL_TREE, $2); } finish_decl (d, NULL_TREE, $2); }
; ;
/* the * rules are dummies to accept the Apollo extended syntax /* the * rules are dummies to accept the Apollo extended syntax
...@@ -1230,6 +1237,8 @@ after_type_declarator: ...@@ -1230,6 +1237,8 @@ after_type_declarator:
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); }
| '*' type_quals after_type_declarator %prec UNARY | '*' type_quals after_type_declarator %prec UNARY
{ $$ = make_pointer_declarator ($2, $3); } { $$ = make_pointer_declarator ($2, $3); }
| attributes setattrs after_type_declarator
{ $$ = $3; }
| TYPENAME | TYPENAME
ifobjc ifobjc
| OBJECTNAME | OBJECTNAME
...@@ -1253,6 +1262,8 @@ parm_declarator: ...@@ -1253,6 +1262,8 @@ parm_declarator:
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); }
| '*' type_quals parm_declarator %prec UNARY | '*' type_quals parm_declarator %prec UNARY
{ $$ = make_pointer_declarator ($2, $3); } { $$ = make_pointer_declarator ($2, $3); }
| attributes setattrs parm_declarator
{ $$ = $3; }
| TYPENAME | TYPENAME
; ;
...@@ -1273,6 +1284,8 @@ notype_declarator: ...@@ -1273,6 +1284,8 @@ notype_declarator:
{ $$ = build_nt (ARRAY_REF, $1, $3); } { $$ = build_nt (ARRAY_REF, $1, $3); }
| notype_declarator '[' ']' %prec '.' | notype_declarator '[' ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); }
| attributes setattrs notype_declarator
{ $$ = $3; }
| IDENTIFIER | IDENTIFIER
; ;
...@@ -1402,14 +1415,14 @@ components: ...@@ -1402,14 +1415,14 @@ components:
component_declarator: component_declarator:
save_filename save_lineno declarator maybe_attribute save_filename save_lineno declarator maybe_attribute
{ $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE); { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE);
decl_attributes ($$, $4); } decl_attributes ($$, $4, prefix_attributes); }
| save_filename save_lineno | save_filename save_lineno
declarator ':' expr_no_commas maybe_attribute declarator ':' expr_no_commas maybe_attribute
{ $$ = grokfield ($1, $2, $3, current_declspecs, $5); { $$ = grokfield ($1, $2, $3, current_declspecs, $5);
decl_attributes ($$, $6); } decl_attributes ($$, $6, prefix_attributes); }
| save_filename save_lineno ':' expr_no_commas maybe_attribute | save_filename save_lineno ':' expr_no_commas maybe_attribute
{ $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4); { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4);
decl_attributes ($$, $5); } decl_attributes ($$, $5, prefix_attributes); }
; ;
/* We chain the enumerators in reverse order. /* We chain the enumerators in reverse order.
...@@ -1480,6 +1493,8 @@ absdcl1: /* a nonempty absolute declarator */ ...@@ -1480,6 +1493,8 @@ absdcl1: /* a nonempty absolute declarator */
{ $$ = build_nt (ARRAY_REF, NULL_TREE, $2); } { $$ = build_nt (ARRAY_REF, NULL_TREE, $2); }
| '[' ']' %prec '.' | '[' ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); } { $$ = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); }
| attributes setattrs absdcl1
{ $$ = $3; }
; ;
/* at least one statement, the first of which parses without error. */ /* at least one statement, the first of which parses without error. */
......
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