diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2007-12-04 21:10:09 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2007-12-04 21:10:09 +0000 |
commit | 3d57f0f08572758a796bffe8776703c9cf16ea75 (patch) | |
tree | 313749fb7158038f9f43d8e9be00ac5f9872e858 /gcc/c-parser.c | |
parent | 2f93f02ca356a40d90f3df0eac1adf1239572d27 (diff) | |
download | gcc-3d57f0f08572758a796bffe8776703c9cf16ea75.zip gcc-3d57f0f08572758a796bffe8776703c9cf16ea75.tar.gz gcc-3d57f0f08572758a796bffe8776703c9cf16ea75.tar.bz2 |
c-parser (c_parser_statement_after_labels): Move error from here...
2007-12-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* c-parser (c_parser_statement_after_labels): Move error from here...
(c_parser_label): ... to here. Check that the declaration is not
actually just another label.
testsuite/
* gcc.dg/parse-decl-after-if.c: New.
* gcc.dg/20031223-1.c: Adjust.
From-SVN: r130606
Diffstat (limited to 'gcc/c-parser.c')
-rw-r--r-- | gcc/c-parser.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 1e32b5b..c2e5435 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -3638,7 +3638,20 @@ c_parser_label (c_parser *parser) } } if (label) - SET_EXPR_LOCATION (label, loc1); + { + SET_EXPR_LOCATION (label, loc1); + if (c_parser_next_token_starts_declspecs (parser) + && !(c_parser_next_token_is (parser, CPP_NAME) + && c_parser_peek_2nd_token (parser)->type == CPP_COLON)) + { + error ("%Ha label can only be part of a statement and " + "a declaration is not a statement", + &c_parser_peek_token (parser)->location); + c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false, + /*nested*/ true, /*empty_ok*/ false, + /*start_attr_ok*/ true); + } + } } /* Parse a statement (C90 6.6, C99 6.8). @@ -3864,16 +3877,6 @@ c_parser_statement_after_labels (c_parser *parser) break; default: expr_stmt: - if (c_parser_next_token_starts_declspecs (parser)) - { - error ("%Ha label can only be part of a statement and " - "a declaration is not a statement", - &c_parser_peek_token (parser)->location); - c_parser_declaration_or_fndef (parser, /*fndef_ok*/ false, - /*nested*/ true, /*empty_ok*/ false, - /*start_attr_ok*/ true); - return; - } stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value); expect_semicolon: c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); |