From: manu Date: Sat, 3 Nov 2007 19:41:20 +0000 (+0000) Subject: 2007-11-03 Manuel Lopez-Ibanez X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=ce53604aa79a9218d85c2041a800bd6e98f15218;p=pf3gnuchains%2Fgcc-fork.git 2007-11-03 Manuel Lopez-Ibanez PR c/29062 * c-parser.c (c_parser_statement_after_labels): Error if a declaration is parsed after a label. testsuite/ * gcc.dg/20031223-1.c: Adjust error output. * gcc.dg/parse-decl-after-label.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129873 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c78cf43c3e3..0ec67363b99 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-11-03 Manuel Lopez-Ibanez + + PR c/29062 + * c-parser.c (c_parser_statement_after_labels): Error if a + declaration is parsed after a label. + 2007-11-03 Daniel Jacobowitz PR debug/33921 diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 29148266f9a..322f600e65d 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -3811,6 +3811,14 @@ c_parser_statement_after_labels (c_parser *parser) break; default: expr_stmt: + if (c_parser_next_token_starts_declspecs (parser)) + { + error ("a label can only be part of a statement and a declaration is not a statement"); + 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 0fec43dd146..4634c63bc86 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-11-03 Manuel Lopez-Ibanez + + PR c/29062 + * gcc.dg/20031223-1.c: Adjust error output. + * gcc.dg/parse-decl-after-label.c: New. + 2007-11-03 Jerry DeLisle PR libfortran/24685 diff --git a/gcc/testsuite/gcc.dg/20031223-1.c b/gcc/testsuite/gcc.dg/20031223-1.c index a022bf2ecf4..d44a9cdcfc5 100644 --- a/gcc/testsuite/gcc.dg/20031223-1.c +++ b/gcc/testsuite/gcc.dg/20031223-1.c @@ -7,5 +7,6 @@ void f () { - l: int; /* { dg-error "" } */ + 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 } */ } diff --git a/gcc/testsuite/gcc.dg/parse-decl-after-label.c b/gcc/testsuite/gcc.dg/parse-decl-after-label.c new file mode 100644 index 00000000000..f457c6a69bd --- /dev/null +++ b/gcc/testsuite/gcc.dg/parse-decl-after-label.c @@ -0,0 +1,17 @@ +/* PR 29062 +{ dg-do compile } +{ dg-options "-fsyntax-only" } +*/ + +int f(x) +{ + if (x > 1) + { + goto finish; + } + return x; + + finish: + int ret = 1; /* { dg-error "a label can only be part of a statement and a declaration is not a statement" } */ + return ret; +}