diff options
author | Richard Biener <rguenther@suse.de> | 2016-12-20 12:50:09 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-12-20 12:50:09 +0000 |
commit | aa90531ea4cfe2ceb9150943f601b67907b27811 (patch) | |
tree | b17f175f4b6ac771ecf38e0e1ec41fec8a0f3803 /gcc/c/gimple-parser.c | |
parent | a676a9a8c5a0dbd81ebcd294afd153b7f62171d6 (diff) | |
download | gcc-aa90531ea4cfe2ceb9150943f601b67907b27811.zip gcc-aa90531ea4cfe2ceb9150943f601b67907b27811.tar.gz gcc-aa90531ea4cfe2ceb9150943f601b67907b27811.tar.bz2 |
gimple-parser.c (c_parser_gimple_compound_statement): Improve error recovery.
2016-12-20 Richard Biener <rguenther@suse.de>
c/
* gimple-parser.c (c_parser_gimple_compound_statement): Improve
error recovery.
(c_parser_gimple_statement): Only build assigns for non-error
stmts.
(c_parser_gimple_postfix_expression_after): Improve error recovery.
From-SVN: r243823
Diffstat (limited to 'gcc/c/gimple-parser.c')
-rw-r--r-- | gcc/c/gimple-parser.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index ddecaec..b7cef93 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -215,7 +215,7 @@ c_parser_gimple_compound_statement (c_parser *parser, gimple_seq *seq) expr_stmt: c_parser_gimple_statement (parser, seq); if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) - return return_p; + c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL); } } c_parser_consume_token (parser); @@ -327,9 +327,12 @@ c_parser_gimple_statement (c_parser *parser, gimple_seq *seq) case CPP_NOT: case CPP_MULT: /* pointer deref */ rhs = c_parser_gimple_unary_expression (parser); - assign = gimple_build_assign (lhs.value, rhs.value); - gimple_set_location (assign, loc); - gimple_seq_add_stmt (seq, assign); + if (rhs.value != error_mark_node) + { + assign = gimple_build_assign (lhs.value, rhs.value); + gimple_set_location (assign, loc); + gimple_seq_add_stmt (seq, assign); + } return; default:; @@ -385,10 +388,13 @@ c_parser_gimple_statement (c_parser *parser, gimple_seq *seq) && lookup_name (c_parser_peek_token (parser)->value)) { rhs = c_parser_gimple_unary_expression (parser); - gimple *call = gimple_build_call_from_tree (rhs.value); - gimple_call_set_lhs (call, lhs.value); - gimple_seq_add_stmt (seq, call); - gimple_set_location (call, loc); + if (rhs.value != error_mark_node) + { + gimple *call = gimple_build_call_from_tree (rhs.value); + gimple_call_set_lhs (call, lhs.value); + gimple_seq_add_stmt (seq, call); + gimple_set_location (call, loc); + } return; } @@ -802,7 +808,10 @@ c_parser_gimple_postfix_expression_after_primary (c_parser *parser, tree idx = c_parser_gimple_unary_expression (parser).value; if (! c_parser_require (parser, CPP_CLOSE_SQUARE, "expected %<]%>")) - break; + { + c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL); + break; + } start = expr.get_start (); finish = c_parser_tokens_buf (parser, 0)->location; |