aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-parser.c25
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/20031223-1.c1
-rw-r--r--gcc/testsuite/gcc.dg/parse-decl-after-if.c11
5 files changed, 37 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9c32e26..a7eb6a2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2007-12-04 Richard Guenther <rguenther@suse.de>
PR middle-end/34334
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 %<;%>");
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 13e2cba..a4fc563 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+
+ * gcc.dg/parse-decl-after-if.c: New.
+ * gcc.dg/20031223-1.c: Adjust.
+
2007-12-04 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33509
diff --git a/gcc/testsuite/gcc.dg/20031223-1.c b/gcc/testsuite/gcc.dg/20031223-1.c
index d44a9cd..c2f35fc 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 0000000..f48e6df
--- /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'" } */
+
+}