diff options
author | Prasad Ghangal <prasad.ghangal@gmail.com> | 2017-02-10 12:47:05 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-02-10 12:47:05 +0000 |
commit | 3dcde5efcd2ead7eee8864a46e1cc0e1fa459318 (patch) | |
tree | cf76d3c77f76b388d6e610eac2a03eb64d5251d9 /gcc/c/gimple-parser.c | |
parent | 6139a3b76c3f149f17d7415d84633cbe617ed72b (diff) | |
download | gcc-3dcde5efcd2ead7eee8864a46e1cc0e1fa459318.zip gcc-3dcde5efcd2ead7eee8864a46e1cc0e1fa459318.tar.gz gcc-3dcde5efcd2ead7eee8864a46e1cc0e1fa459318.tar.bz2 |
gimple-parser.c (c_parser_gimple_binary_expression): Avoid building IL when arguments are error_mark_node.
2017-02-10 Prasad Ghangal <prasad.ghangal@gmail.com>
Richard Biener <rguenther@suse.de>
* gimple-parser.c (c_parser_gimple_binary_expression): Avoid
building IL when arguments are error_mark_node.
(c_parser_gimple_unary_expression): Likewise.
(c_parser_gimple_if_stmt): Likewise.
(c_parser_gimple_switch_stmt): Likewise.
(c_parser_gimple_return_stmt): Likewise.
(c_parser_parse_ssa_name): When name lookup fails do not build
an SSA name. Use undeclared rather than not declared in error
reporting.
* gcc.dg/gimplefe-error-1.c: New testcase.
* gcc.dg/gimplefe-error-2.c: New testcase.
* gcc.dg/gimplefe-error-3.c: New testcase.
Co-Authored-By: Richard Biener <rguenther@suse.de>
From-SVN: r245326
Diffstat (limited to 'gcc/c/gimple-parser.c')
-rw-r--r-- | gcc/c/gimple-parser.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index e167e42..afa2e52 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -524,9 +524,8 @@ c_parser_gimple_binary_expression (c_parser *parser) location_t ret_loc = c_parser_peek_token (parser)->location; c_parser_consume_token (parser); rhs = c_parser_gimple_postfix_expression (parser); - if (c_parser_error (parser)) - return ret; - ret.value = build2_loc (ret_loc, code, ret_type, lhs.value, rhs.value); + if (lhs.value != error_mark_node && rhs.value != error_mark_node) + ret.value = build2_loc (ret_loc, code, ret_type, lhs.value, rhs.value); return ret; } @@ -560,6 +559,8 @@ c_parser_gimple_unary_expression (c_parser *parser) { c_parser_consume_token (parser); op = c_parser_gimple_postfix_expression (parser); + if (op.value == error_mark_node) + return ret; finish = op.get_finish (); location_t combined_loc = make_location (op_loc, op_loc, finish); ret.value = build_simple_mem_ref_loc (combined_loc, op.value); @@ -643,7 +644,7 @@ c_parser_parse_ssa_name (c_parser *parser, { if (! type) { - c_parser_error (parser, "SSA name not declared"); + c_parser_error (parser, "SSA name undeclared"); return error_mark_node; } name = make_ssa_name_fn (cfun, type, NULL, version); @@ -663,9 +664,9 @@ c_parser_parse_ssa_name (c_parser *parser, id = get_identifier (var_name); tree parent = lookup_name (id); XDELETEVEC (var_name); - if (! parent) + if (! parent || parent == error_mark_node) { - c_parser_error (parser, "base variable or SSA name not declared"); + c_parser_error (parser, "base variable or SSA name undeclared"); return error_mark_node; } if (VECTOR_TYPE_P (TREE_TYPE (parent)) @@ -1300,8 +1301,9 @@ c_parser_gimple_if_stmt (c_parser *parser, gimple_seq *seq) return; } - gimple_seq_add_stmt (seq, gimple_build_cond_from_tree (cond, t_label, - f_label)); + if (cond != error_mark_node) + gimple_seq_add_stmt (seq, gimple_build_cond_from_tree (cond, t_label, + f_label)); } /* Parse gimple switch-statement. @@ -1441,10 +1443,13 @@ c_parser_gimple_switch_stmt (c_parser *parser, gimple_seq *seq) } if (! c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>")) return; - gimple_seq_add_stmt (seq, gimple_build_switch (cond_expr.value, - default_label, labels)); - gimple_seq_add_seq (seq, switch_body); - labels.release(); + + if (cond_expr.value != error_mark_node) + { + gimple_seq_add_stmt (seq, gimple_build_switch (cond_expr.value, + default_label, labels)); + gimple_seq_add_seq (seq, switch_body); + } } /* Parse gimple return statement. */ @@ -1465,9 +1470,12 @@ c_parser_gimple_return_stmt (c_parser *parser, gimple_seq *seq) { location_t xloc = c_parser_peek_token (parser)->location; c_expr expr = c_parser_gimple_unary_expression (parser); - c_finish_gimple_return (xloc, expr.value); - ret = gimple_build_return (expr.value); - gimple_seq_add_stmt (seq, ret); + if (expr.value != error_mark_node) + { + c_finish_gimple_return (xloc, expr.value); + ret = gimple_build_return (expr.value); + gimple_seq_add_stmt (seq, ret); + } } } |