Hi,
The attached patch tries fix ICE due to undeclared variable(s) in the input.
Successfully bootstrapped on x86_64-pc-linux-gnu, testing is in progress


Thanks,
Prasad

Attachment: Changelog
Description: Binary data

diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index b7cef93..13bf2b1 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -516,7 +516,9 @@ c_parser_gimple_binary_expression (c_parser *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;
 }
 
@@ -653,7 +655,7 @@ 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"); 
 	      return error_mark_node;
@@ -1194,6 +1196,8 @@ c_parser_gimple_if_stmt (c_parser *parser, gimple_seq *seq)
   location_t loc;
   c_parser_consume_token (parser);
   tree cond = c_parser_gimple_paren_condition (parser);
+  if (cond == error_mark_node)
+    return;
 
   if (c_parser_next_token_is_keyword (parser, RID_GOTO))
     {
@@ -1252,7 +1256,7 @@ c_parser_gimple_if_stmt (c_parser *parser, gimple_seq *seq)
 static void
 c_parser_gimple_switch_stmt (c_parser *parser, gimple_seq *seq)
 {
-  c_expr cond_expr;
+  tree cond = error_mark_node;
   tree case_label, label;
   auto_vec<tree> labels;
   tree default_label = NULL_TREE;
@@ -1261,9 +1265,11 @@ c_parser_gimple_switch_stmt (c_parser *parser, gimple_seq *seq)
 
   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
     {
-      cond_expr = c_parser_gimple_postfix_expression (parser);
+      cond = c_parser_gimple_postfix_expression (parser).value;
       if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
 	return;
+      if (cond == error_mark_node)
+	return;
     }
 
   if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
@@ -1374,7 +1380,7 @@ 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,
+  gimple_seq_add_stmt (seq, gimple_build_switch (cond,
 						 default_label, labels));
   gimple_seq_add_seq (seq, switch_body);
   labels.release();

Reply via email to