aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-parser.c
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2007-12-04 21:10:09 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2007-12-04 21:10:09 +0000
commit3d57f0f08572758a796bffe8776703c9cf16ea75 (patch)
tree313749fb7158038f9f43d8e9be00ac5f9872e858 /gcc/c-parser.c
parent2f93f02ca356a40d90f3df0eac1adf1239572d27 (diff)
downloadgcc-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.c25
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 %<;%>");