From 3d57f0f08572758a796bffe8776703c9cf16ea75 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Manuel=20L=C3=B3pez-Ib=C3=A1=C3=B1ez?= Date: Tue, 4 Dec 2007 21:10:09 +0000 Subject: [PATCH] c-parser (c_parser_statement_after_labels): Move error from here... 2007-12-04 Manuel Lopez-Ibanez * 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 --- gcc/ChangeLog | 6 ++++++ gcc/c-parser.c | 25 ++++++++++++---------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/20031223-1.c | 1 + gcc/testsuite/gcc.dg/parse-decl-after-if.c | 11 ++++++++++ 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/parse-decl-after-if.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9c32e260a70..a7eb6a2847b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-12-04 Manuel Lopez-Ibanez + + * 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. + 2007-12-04 Richard Guenther PR middle-end/34334 diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 1e32b5b9d98..c2e5435af26 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 %<;%>"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 13e2cbaca09..a4fc563cbb6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-12-04 Manuel Lopez-Ibanez + + * gcc.dg/parse-decl-after-if.c: New. + * gcc.dg/20031223-1.c: Adjust. + 2007-12-04 Douglas Gregor PR c++/33509 diff --git a/gcc/testsuite/gcc.dg/20031223-1.c b/gcc/testsuite/gcc.dg/20031223-1.c index d44a9cdcfc5..c2f35fcfe7f 100644 --- a/gcc/testsuite/gcc.dg/20031223-1.c +++ b/gcc/testsuite/gcc.dg/20031223-1.c @@ -9,4 +9,5 @@ void f () { l: int; /* { dg-error "a label can only be part of a statement and a declaration is not a statement" } */ /* { dg-warning "useless type name in empty declaration" "" { target *-*-* } 10 } */ + /* { dg-error "label at end of compound statement" "" { target *-*-* } 10 } */ } diff --git a/gcc/testsuite/gcc.dg/parse-decl-after-if.c b/gcc/testsuite/gcc.dg/parse-decl-after-if.c new file mode 100644 index 00000000000..f48e6dfc26b --- /dev/null +++ b/gcc/testsuite/gcc.dg/parse-decl-after-if.c @@ -0,0 +1,11 @@ +/* Parse error recovery +{ dg-do compile } +{ dg-options "-fsyntax-only" } +*/ + +void f(x) +{ + if (x > 1) + int ret = 1; /* { dg-error "expected expression before 'int'" } */ + +} -- 2.30.2