aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-parse.in
diff options
context:
space:
mode:
authorJoseph Myers <jsm28@cam.ac.uk>2000-11-13 14:08:09 +0000
committerJoseph Myers <jsm28@gcc.gnu.org>2000-11-13 14:08:09 +0000
commit444ca59fa44336fbfe4744c9870bf1dd0a75093f (patch)
tree813f582e01755dc24b3956ee33ab7b1309e45624 /gcc/c-parse.in
parentf2ecb02d79f0d5df0d602c33562e3b9eec5085b7 (diff)
downloadgcc-444ca59fa44336fbfe4744c9870bf1dd0a75093f.zip
gcc-444ca59fa44336fbfe4744c9870bf1dd0a75093f.tar.gz
gcc-444ca59fa44336fbfe4744c9870bf1dd0a75093f.tar.bz2
c-parse.in (c99_block_start, [...]): New.
* c-parse.in (c99_block_start, c99_block_end, c99_block_lineno_labeled_stmt): New. (simple_if, do_stmt_start): Use c99_block_lineno_labeled_stmt. (stmt): Split off selection and iteration statements into... (select_or_iter_stmt): New. Use c99_block_lineno_labeled_stmt. testsuite: * gcc.dg/c99-scope-1.c: Remove xfail. * gcc.dg/c99-scope-2.c: New test. From-SVN: r37427
Diffstat (limited to 'gcc/c-parse.in')
-rw-r--r--gcc/c-parse.in76
1 files changed, 62 insertions, 14 deletions
diff --git a/gcc/c-parse.in b/gcc/c-parse.in
index 3550bef..bbce2ca 100644
--- a/gcc/c-parse.in
+++ b/gcc/c-parse.in
@@ -176,6 +176,7 @@ end ifc
%type <ttype> compstmt compstmt_start compstmt_nostart compstmt_primary_start
%type <ttype> do_stmt_start poplevel
+%type <ttype> c99_block_start c99_block_end
%type <ttype> declarator
%type <ttype> notype_declarator after_type_declarator
%type <ttype> parm_declarator
@@ -1623,6 +1624,40 @@ end ifobjc
poplevel: /* empty */
{ $$ = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); }
+/* Start and end blocks created for the new scopes of C99. */
+c99_block_start: /* empty */
+ { if (flag_isoc99)
+ {
+ $$ = c_begin_compound_stmt ();
+ pushlevel (0);
+ clear_last_expr ();
+ add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
+ifobjc
+ if (objc_method_context)
+ add_objc_decls ();
+end ifobjc
+ }
+ else
+ $$ = NULL_TREE;
+ }
+ ;
+
+/* Productions using c99_block_start and c99_block_end will need to do what's
+ in compstmt: RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); $$ = $2; where
+ $1 is the value of c99_block_start and $2 of c99_block_end. */
+c99_block_end: /* empty */
+ { if (flag_isoc99)
+ {
+ tree scope_stmt = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
+ $$ = poplevel (kept_level_p (), 0, 0);
+ SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt))
+ = SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmt))
+ = $$;
+ }
+ else
+ $$ = NULL_TREE; }
+ ;
+
/* Read zero or more forward-declarations for labels
that nested functions can jump to. */
maybe_label_decls:
@@ -1703,7 +1738,7 @@ compstmt: compstmt_start compstmt_nostart
/* Value is number of statements counted as of the closeparen. */
simple_if:
- if_prefix lineno_labeled_stmt
+ if_prefix c99_block_lineno_labeled_stmt
{ c_finish_then (); }
/* Make sure c_expand_end_cond is run once
for each call to c_expand_start_cond.
@@ -1735,7 +1770,7 @@ do_stmt_start:
condition now. Otherwise, we can get crashes at
RTL-generation time. */
DO_COND ($<ttype>$) = error_mark_node; }
- lineno_labeled_stmt WHILE
+ c99_block_lineno_labeled_stmt WHILE
{ $$ = $<ttype>2;
RECHAIN_STMTS ($$, DO_BODY ($$)); }
;
@@ -1765,6 +1800,13 @@ lineno_labeled_stmt:
{ }
;
+/* Like lineno_labeled_stmt, but a block in C99. */
+c99_block_lineno_labeled_stmt:
+ c99_block_start lineno_labeled_stmt c99_block_end
+ { if (flag_isoc99)
+ RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); }
+ ;
+
lineno_stmt_or_label:
save_filename save_lineno stmt_or_label
{ $$ = $3; }
@@ -1777,17 +1819,11 @@ stmt_or_label:
{ $$ = 1; }
;
-/* Parse a single real statement, not including any labels. */
-stmt:
- compstmt
- { stmt_count++; }
- | expr ';'
- { stmt_count++;
- c_expand_expr_stmt ($1); }
- | simple_if ELSE
+select_or_iter_stmt:
+ simple_if ELSE
{ c_expand_start_else ();
$<itype>1 = stmt_count; }
- lineno_labeled_stmt
+ c99_block_lineno_labeled_stmt
{ c_finish_else ();
c_expand_end_cond ();
if (extra_warnings && stmt_count == $<itype>1)
@@ -1812,7 +1848,7 @@ stmt:
{ $4 = truthvalue_conversion ($4);
$<ttype>$
= add_stmt (build_stmt (WHILE_STMT, $4, NULL_TREE)); }
- lineno_labeled_stmt
+ c99_block_lineno_labeled_stmt
{ RECHAIN_STMTS ($<ttype>6, WHILE_BODY ($<ttype>6)); }
| do_stmt_start
'(' expr ')' ';'
@@ -1831,13 +1867,25 @@ stmt:
{ FOR_COND ($<ttype>5) = $6; }
xexpr ')'
{ FOR_EXPR ($<ttype>5) = $9; }
- lineno_labeled_stmt
+ c99_block_lineno_labeled_stmt
{ RECHAIN_STMTS ($<ttype>5, FOR_BODY ($<ttype>5)); }
| SWITCH '(' expr ')'
{ stmt_count++;
$<ttype>$ = c_start_case ($3); }
- lineno_labeled_stmt
+ c99_block_lineno_labeled_stmt
{ c_finish_case (); }
+ ;
+
+/* Parse a single real statement, not including any labels. */
+stmt:
+ compstmt
+ { stmt_count++; }
+ | expr ';'
+ { stmt_count++;
+ c_expand_expr_stmt ($1); }
+ | c99_block_start select_or_iter_stmt c99_block_end
+ { if (flag_isoc99)
+ RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); }
| BREAK ';'
{ stmt_count++;
add_stmt (build_break_stmt ()); }