diff options
author | Nicola Pero <nicola@gcc.gnu.org> | 2011-05-24 21:29:35 +0000 |
---|---|---|
committer | Nicola Pero <nicola@gcc.gnu.org> | 2011-05-24 21:29:35 +0000 |
commit | 4e26ba9022c2052fee9511a0f9d343da5645029f (patch) | |
tree | 45a2ea1e54c55ccbf8843a2f531a8fac8f843c25 /gcc/c-parser.c | |
parent | 936fd13c5b33cd6748788802ec3bb3445a396228 (diff) | |
download | gcc-4e26ba9022c2052fee9511a0f9d343da5645029f.zip gcc-4e26ba9022c2052fee9511a0f9d343da5645029f.tar.gz gcc-4e26ba9022c2052fee9511a0f9d343da5645029f.tar.bz2 |
In gcc/: 2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>
In gcc/:
2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>
PR objc/48187
* c-parser.c (c_parser_objc_class_instance_variables): More robust
parsing of syntax error in ObjC instance variable lists. In
particular, avoid an infinite loop if there is a stray ']'.
Updated error message.
In gcc/cp/:
2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>,
* parser.c (cp_parser_objc_class_ivars): Deal gracefully with a
syntax error in declaring an ObjC instance variable.
In gcc/testsuite/:
2011-05-24 Nicola Pero <nicola.pero@meta-innovation.com>
PR objc/48187
* objc.dg/pr48187.m: New testcase.
* obj-c++.dg/pr48187.mm: New testcase.
* objc.dg/ivar-extra-semicolon.m: New testcase.
From-SVN: r174142
Diffstat (limited to 'gcc/c-parser.c')
-rw-r--r-- | gcc/c-parser.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 241bc38..cb70bed 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -6945,7 +6945,7 @@ c_parser_objc_class_instance_variables (c_parser *parser) if (c_parser_next_token_is (parser, CPP_SEMICOLON)) { pedwarn (c_parser_peek_token (parser)->location, OPT_pedantic, - "extra semicolon in struct or union specified"); + "extra semicolon"); c_parser_consume_token (parser); continue; } @@ -6988,13 +6988,34 @@ c_parser_objc_class_instance_variables (c_parser *parser) /* Parse some comma-separated declarations. */ decls = c_parser_struct_declaration (parser); - { - /* Comma-separated instance variables are chained together in - reverse order; add them one by one. */ - tree ivar = nreverse (decls); - for (; ivar; ivar = DECL_CHAIN (ivar)) - objc_add_instance_variable (copy_node (ivar)); - } + if (decls == NULL) + { + /* There is a syntax error. We want to skip the offending + tokens up to the next ';' (included) or '}' + (excluded). */ + + /* First, skip manually a ')' or ']'. This is because they + reduce the nesting level, so c_parser_skip_until_found() + wouldn't be able to skip past them. */ + c_token *token = c_parser_peek_token (parser); + if (token->type == CPP_CLOSE_PAREN || token->type == CPP_CLOSE_SQUARE) + c_parser_consume_token (parser); + + /* Then, do the standard skipping. */ + c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); + + /* We hopefully recovered. Start normal parsing again. */ + parser->error = false; + continue; + } + else + { + /* Comma-separated instance variables are chained together + in reverse order; add them one by one. */ + tree ivar = nreverse (decls); + for (; ivar; ivar = DECL_CHAIN (ivar)) + objc_add_instance_variable (copy_node (ivar)); + } c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); } } |