aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-parse.in76
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/c99-scope-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/c99-scope-2.c71
5 files changed, 147 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 80a80df..6d026b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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,
-time): Update.
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 ()); }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 53362e0..cf20ec6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
* gcc.c-torture/execute/string-opt-3.c: Also test builtin rindex.
diff --git a/gcc/testsuite/gcc.dg/c99-scope-1.c b/gcc/testsuite/gcc.dg/c99-scope-1.c
index 256b39c..48ea3b0 100644
--- a/gcc/testsuite/gcc.dg/c99-scope-1.c
+++ b/gcc/testsuite/gcc.dg/c99-scope-1.c
@@ -1,6 +1,6 @@
/* Test for new block scopes in C99. Inspired by C99 Rationale (N897). */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
-/* { dg-do run { xfail *-*-* } } */
+/* { dg-do run } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
struct foo {
diff --git a/gcc/testsuite/gcc.dg/c99-scope-2.c b/gcc/testsuite/gcc.dg/c99-scope-2.c
new file mode 100644
index 0000000..5b81f70
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c99-scope-2.c
@@ -0,0 +1,71 @@
+/* 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);
+}