Commit 444ca59f by Joseph Myers Committed by Joseph Myers

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
parent f2ecb02d
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk> 2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* 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.
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* invoke.texi (-Wtrigraphs, -fdump-translation-unit, -save-temps, * invoke.texi (-Wtrigraphs, -fdump-translation-unit, -save-temps,
-time): Update. -time): Update.
......
...@@ -176,6 +176,7 @@ end ifc ...@@ -176,6 +176,7 @@ end ifc
%type <ttype> compstmt compstmt_start compstmt_nostart compstmt_primary_start %type <ttype> compstmt compstmt_start compstmt_nostart compstmt_primary_start
%type <ttype> do_stmt_start poplevel %type <ttype> do_stmt_start poplevel
%type <ttype> c99_block_start c99_block_end
%type <ttype> declarator %type <ttype> declarator
%type <ttype> notype_declarator after_type_declarator %type <ttype> notype_declarator after_type_declarator
%type <ttype> parm_declarator %type <ttype> parm_declarator
...@@ -1623,6 +1624,40 @@ end ifobjc ...@@ -1623,6 +1624,40 @@ end ifobjc
poplevel: /* empty */ poplevel: /* empty */
{ $$ = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); } { $$ = 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 /* Read zero or more forward-declarations for labels
that nested functions can jump to. */ that nested functions can jump to. */
maybe_label_decls: maybe_label_decls:
...@@ -1703,7 +1738,7 @@ compstmt: compstmt_start compstmt_nostart ...@@ -1703,7 +1738,7 @@ compstmt: compstmt_start compstmt_nostart
/* Value is number of statements counted as of the closeparen. */ /* Value is number of statements counted as of the closeparen. */
simple_if: simple_if:
if_prefix lineno_labeled_stmt if_prefix c99_block_lineno_labeled_stmt
{ c_finish_then (); } { c_finish_then (); }
/* Make sure c_expand_end_cond is run once /* Make sure c_expand_end_cond is run once
for each call to c_expand_start_cond. for each call to c_expand_start_cond.
...@@ -1735,7 +1770,7 @@ do_stmt_start: ...@@ -1735,7 +1770,7 @@ do_stmt_start:
condition now. Otherwise, we can get crashes at condition now. Otherwise, we can get crashes at
RTL-generation time. */ RTL-generation time. */
DO_COND ($<ttype>$) = error_mark_node; } DO_COND ($<ttype>$) = error_mark_node; }
lineno_labeled_stmt WHILE c99_block_lineno_labeled_stmt WHILE
{ $$ = $<ttype>2; { $$ = $<ttype>2;
RECHAIN_STMTS ($$, DO_BODY ($$)); } RECHAIN_STMTS ($$, DO_BODY ($$)); }
; ;
...@@ -1765,6 +1800,13 @@ lineno_labeled_stmt: ...@@ -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: lineno_stmt_or_label:
save_filename save_lineno stmt_or_label save_filename save_lineno stmt_or_label
{ $$ = $3; } { $$ = $3; }
...@@ -1777,17 +1819,11 @@ stmt_or_label: ...@@ -1777,17 +1819,11 @@ stmt_or_label:
{ $$ = 1; } { $$ = 1; }
; ;
/* Parse a single real statement, not including any labels. */ select_or_iter_stmt:
stmt: simple_if ELSE
compstmt
{ stmt_count++; }
| expr ';'
{ stmt_count++;
c_expand_expr_stmt ($1); }
| simple_if ELSE
{ c_expand_start_else (); { c_expand_start_else ();
$<itype>1 = stmt_count; } $<itype>1 = stmt_count; }
lineno_labeled_stmt c99_block_lineno_labeled_stmt
{ c_finish_else (); { c_finish_else ();
c_expand_end_cond (); c_expand_end_cond ();
if (extra_warnings && stmt_count == $<itype>1) if (extra_warnings && stmt_count == $<itype>1)
...@@ -1812,7 +1848,7 @@ stmt: ...@@ -1812,7 +1848,7 @@ stmt:
{ $4 = truthvalue_conversion ($4); { $4 = truthvalue_conversion ($4);
$<ttype>$ $<ttype>$
= add_stmt (build_stmt (WHILE_STMT, $4, NULL_TREE)); } = 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)); } { RECHAIN_STMTS ($<ttype>6, WHILE_BODY ($<ttype>6)); }
| do_stmt_start | do_stmt_start
'(' expr ')' ';' '(' expr ')' ';'
...@@ -1831,13 +1867,25 @@ stmt: ...@@ -1831,13 +1867,25 @@ stmt:
{ FOR_COND ($<ttype>5) = $6; } { FOR_COND ($<ttype>5) = $6; }
xexpr ')' xexpr ')'
{ FOR_EXPR ($<ttype>5) = $9; } { FOR_EXPR ($<ttype>5) = $9; }
lineno_labeled_stmt c99_block_lineno_labeled_stmt
{ RECHAIN_STMTS ($<ttype>5, FOR_BODY ($<ttype>5)); } { RECHAIN_STMTS ($<ttype>5, FOR_BODY ($<ttype>5)); }
| SWITCH '(' expr ')' | SWITCH '(' expr ')'
{ stmt_count++; { stmt_count++;
$<ttype>$ = c_start_case ($3); } $<ttype>$ = c_start_case ($3); }
lineno_labeled_stmt c99_block_lineno_labeled_stmt
{ c_finish_case (); } { 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 ';' | BREAK ';'
{ stmt_count++; { stmt_count++;
add_stmt (build_break_stmt ()); } add_stmt (build_break_stmt ()); }
......
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/c99-scope-1.c: Remove xfail.
* gcc.dg/c99-scope-2.c: New test.
2000-11-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2000-11-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.c-torture/execute/string-opt-3.c: Also test builtin rindex. * gcc.c-torture/execute/string-opt-3.c: Also test builtin rindex.
......
/* Test for new block scopes in C99. Inspired by C99 Rationale (N897). */ /* Test for new block scopes in C99. Inspired by C99 Rationale (N897). */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */ /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do run { xfail *-*-* } } */ /* { dg-do run } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ /* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
struct foo { struct foo {
......
/* Test for new block scopes in C99. Test for each new scope. */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do run } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
extern void abort (void);
extern void exit (int);
int
main (void)
{
struct foo { int i0; };
int a, b, c, d;
a = sizeof (struct foo);
if (b = sizeof (struct foo { int i0; int i1; }))
c = sizeof (struct foo { int i0; int i1; int i2; });
if (!(a < b && b < c))
abort ();
if ((b = sizeof (struct foo { int i0; int i1; })), 0)
c = sizeof (struct foo { int i0; int i1; int i2; });
else
d = sizeof (struct foo { int i0; int i1; int i2; int i3; });
if (!(a < b && b < d))
abort ();
switch (b = sizeof (struct foo { int i0; int i1; }))
default:
c = sizeof (struct foo { int i0; int i1; int i2; });
if (!(a < b && b < c))
abort ();
do
c = sizeof (struct foo { int i0; int i1; int i2; });
while ((b = sizeof (struct foo { int i0; int i1; })), 0);
if (!(a < b && b < c))
abort ();
d = 1;
while ((b = sizeof (struct foo { int i0; int i1; })), d)
(c = sizeof (struct foo { int i0; int i1; int i2; })), d--;
if (!(a < b && b < c))
abort ();
d = 1;
for ((b = sizeof (struct foo { int i0; int i1; })); d; d--)
c = sizeof (struct foo { int i0; int i1; int i2; });
if (!(a < b && b < c))
abort ();
d = 1;
for ((b = sizeof (struct foo { int i0; int i1; })); d; d--)
c = sizeof (struct foo);
if (!(a < b && b == c))
abort ();
d = 1;
for (; (b = sizeof (struct foo { int i0; int i1; })), d; d--)
c = sizeof (struct foo { int i0; int i1; int i2; });
if (!(a < b && b < c))
abort ();
d = 1;
for (; (b = sizeof (struct foo { int i0; int i1; })), d; d--)
c = sizeof (struct foo);
if (!(a < b && b == c))
abort ();
d = 1;
for (; d; (b = sizeof (struct foo { int i0; int i1; })), d--)
c = sizeof (struct foo { int i0; int i1; int i2; });
if (!(a < b && b < c))
abort ();
d = 1;
for (; d; (b = sizeof (struct foo { int i0; int i1; })), d--)
c = sizeof (struct foo);
if (!(a < b && b == c))
abort ();
exit (0);
}
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