Commit b7438415 by Joseph Myers Committed by Joseph Myers

c-parse.in (ends_in_label): Remove from %union and %type.

	* c-parse.in (ends_in_label): Remove from %union and %type.
	(decls, stmts, lineno_stmt_or_labels, xstmts,
	lineno_stmt_or_label, stmt_or_label): Remove.
	(stmts_and_decls, lineno_stmt_decl_or_labels_ending_stmt,
	lineno_stmt_decl_or_labels_ending_decl,
	lineno_stmt_decl_or_labels_ending_label,
	lineno_stmt_decl_or_labels_ending_error,
	lineno_stmt_decl_or_labels, compstmt_contents_nonempty,
	lineno_stmt, lineno_label): New.
	(compstmt_nostart): Use compstmt_contents_nonempty.

testsuite:
	* gcc.dg/c99-mixdecl-1.c, gcc.dg/c90-mixdecl-1.c: New tests.

From-SVN: r37429
parent 19552aa5
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk> 2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* c-parse.in (ends_in_label): Remove from %union and %type.
(decls, stmts, lineno_stmt_or_labels, xstmts,
lineno_stmt_or_label, stmt_or_label): Remove.
(stmts_and_decls, lineno_stmt_decl_or_labels_ending_stmt,
lineno_stmt_decl_or_labels_ending_decl,
lineno_stmt_decl_or_labels_ending_label,
lineno_stmt_decl_or_labels_ending_error,
lineno_stmt_decl_or_labels, compstmt_contents_nonempty,
lineno_stmt, lineno_label): New.
(compstmt_nostart): Use compstmt_contents_nonempty.
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* c-common.c (boolean_increment): New function. * c-common.c (boolean_increment): New function.
* c-common.h (enum c_tree_index): Add CTI_C_BOOL_TYPE, * c-common.h (enum c_tree_index): Add CTI_C_BOOL_TYPE,
CTI_C_BOOL_TRUE and CTI_C_BOOL_FALSE. CTI_C_BOOL_TRUE and CTI_C_BOOL_FALSE.
......
...@@ -79,7 +79,7 @@ end ifc ...@@ -79,7 +79,7 @@ end ifc
%start program %start program
%union {long itype; tree ttype; enum tree_code code; %union {long itype; tree ttype; enum tree_code code;
const char *filename; int lineno; int ends_in_label; } const char *filename; int lineno; }
/* All identifiers that are not reserved words /* All identifiers that are not reserved words
and are not declared typedefs in the current block */ and are not declared typedefs in the current block */
...@@ -194,8 +194,6 @@ end ifc ...@@ -194,8 +194,6 @@ end ifc
%type <itype> setspecs %type <itype> setspecs
%type <ends_in_label> lineno_stmt_or_label lineno_stmt_or_labels stmt_or_label
%type <filename> save_filename %type <filename> save_filename
%type <lineno> save_lineno %type <lineno> save_lineno
...@@ -824,13 +822,6 @@ lineno_decl: ...@@ -824,13 +822,6 @@ lineno_decl:
{ } { }
; ;
decls:
lineno_decl
| errstmt
| decls lineno_decl
| lineno_decl errstmt
;
/* records the type and storage class specs to use for processing /* records the type and storage class specs to use for processing
the declarators that follow. the declarators that follow.
Maintains a stack of outer-level values of current_declspecs, Maintains a stack of outer-level values of current_declspecs,
...@@ -1582,29 +1573,58 @@ absdcl1: /* a nonempty absolute declarator */ ...@@ -1582,29 +1573,58 @@ absdcl1: /* a nonempty absolute declarator */
{ $$ = $3; } { $$ = $3; }
; ;
/* at least one statement, the first of which parses without error. */ /* A nonempty series of declarations and statements (possibly followed by
/* stmts is used only after decls, so an invalid first statement some labels) that can form the body of a compound statement.
is actually regarded as an invalid decl and part of the decls. */ NOTE: we don't allow labels on declarations; this might seem like a
natural extension, but there would be a conflict between attributes
on the label and prefix attributes on the declaration. */
stmts: stmts_and_decls:
lineno_stmt_or_labels lineno_stmt_decl_or_labels_ending_stmt
| lineno_stmt_decl_or_labels_ending_decl
| lineno_stmt_decl_or_labels_ending_label
{ {
if (pedantic && $1) if (pedantic)
pedwarn ("ISO C forbids label at end of compound statement"); pedwarn ("ISO C forbids label at end of compound statement");
} }
| lineno_stmt_decl_or_labels_ending_error
; ;
lineno_stmt_or_labels: lineno_stmt_decl_or_labels_ending_stmt:
lineno_stmt_or_label lineno_stmt
| lineno_stmt_or_labels lineno_stmt_or_label | lineno_stmt_decl_or_labels_ending_stmt lineno_stmt
{ $$ = $2; } | lineno_stmt_decl_or_labels_ending_decl lineno_stmt
| lineno_stmt_or_labels errstmt | lineno_stmt_decl_or_labels_ending_label lineno_stmt
{ $$ = 0; } | lineno_stmt_decl_or_labels_ending_error lineno_stmt
; ;
xstmts: lineno_stmt_decl_or_labels_ending_decl:
/* empty */ lineno_decl
| stmts | lineno_stmt_decl_or_labels_ending_stmt lineno_decl
{ if (pedantic && !flag_isoc99)
pedwarn ("ISO C89 forbids mixed declarations and code"); }
| lineno_stmt_decl_or_labels_ending_decl lineno_decl
| lineno_stmt_decl_or_labels_ending_error lineno_decl
;
lineno_stmt_decl_or_labels_ending_label:
lineno_label
| lineno_stmt_decl_or_labels_ending_stmt lineno_label
| lineno_stmt_decl_or_labels_ending_decl lineno_label
| lineno_stmt_decl_or_labels_ending_label lineno_label
| lineno_stmt_decl_or_labels_ending_error lineno_label
;
lineno_stmt_decl_or_labels_ending_error:
errstmt
| lineno_stmt_decl_or_labels errstmt
;
lineno_stmt_decl_or_labels:
lineno_stmt_decl_or_labels_ending_stmt
| lineno_stmt_decl_or_labels_ending_decl
| lineno_stmt_decl_or_labels_ending_label
| lineno_stmt_decl_or_labels_ending_error
; ;
errstmt: error ';' errstmt: error ';'
...@@ -1697,23 +1717,18 @@ compstmt_start: '{' { compstmt_count++; ...@@ -1697,23 +1717,18 @@ compstmt_start: '{' { compstmt_count++;
compstmt_nostart: '}' compstmt_nostart: '}'
{ $$ = convert (void_type_node, integer_zero_node); } { $$ = convert (void_type_node, integer_zero_node); }
| pushlevel maybe_label_decls decls xstmts '}' poplevel | pushlevel maybe_label_decls compstmt_contents_nonempty '}' poplevel
{ $$ = poplevel (1, 1, 0); { $$ = poplevel (kept_level_p (), 1, 0);
SCOPE_STMT_BLOCK (TREE_PURPOSE ($6))
= SCOPE_STMT_BLOCK (TREE_VALUE ($6))
= $$; }
| pushlevel maybe_label_decls error '}' poplevel
{ $$ = poplevel (kept_level_p (), 0, 0);
SCOPE_STMT_BLOCK (TREE_PURPOSE ($5))
= SCOPE_STMT_BLOCK (TREE_VALUE ($5))
= $$; }
| pushlevel maybe_label_decls stmts '}' poplevel
{ $$ = poplevel (kept_level_p (), 0, 0);
SCOPE_STMT_BLOCK (TREE_PURPOSE ($5)) SCOPE_STMT_BLOCK (TREE_PURPOSE ($5))
= SCOPE_STMT_BLOCK (TREE_VALUE ($5)) = SCOPE_STMT_BLOCK (TREE_VALUE ($5))
= $$; } = $$; }
; ;
compstmt_contents_nonempty:
stmts_and_decls
| error
;
compstmt_primary_start: compstmt_primary_start:
'(' '{' '(' '{'
{ if (current_function_decl == 0) { if (current_function_decl == 0)
...@@ -1807,16 +1822,14 @@ c99_block_lineno_labeled_stmt: ...@@ -1807,16 +1822,14 @@ c99_block_lineno_labeled_stmt:
RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); } RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); }
; ;
lineno_stmt_or_label: lineno_stmt:
save_filename save_lineno stmt_or_label save_filename save_lineno stmt
{ $$ = $3; } { }
; ;
stmt_or_label: lineno_label:
stmt save_filename save_lineno label
{ $$ = 0; } { }
| label
{ $$ = 1; }
; ;
select_or_iter_stmt: select_or_iter_stmt:
......
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk> 2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/c99-mixdecl-1.c, gcc.dg/c90-mixdecl-1.c: New tests.
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/c99-bool-1.c: New test. * gcc.dg/c99-bool-1.c: New test.
2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk> 2000-11-13 Joseph S. Myers <jsm28@cam.ac.uk>
......
/* Test for C99 mixed declarations and code: not in C90. */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
void
foo (void)
{
int i;
i = 0;
int j; /* { dg-bogus "warning" "warning in place of error" } */
/* { dg-error "mix|parse" "mixed declarations and code not in C90" { target *-*-* } 11 } */
}
/* Test for C99 mixed declarations and code. */
/* 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)
{
int i = 0;
if (i != 0)
abort ();
i++;
if (i != 1)
abort ();
int j = i;
if (j != 1)
abort ();
struct foo { int i0; } k = { 4 };
if (k.i0 != 4)
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