diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index e167e42..7aad636 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -526,7 +526,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;
 }
 
@@ -560,6 +562,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);
@@ -663,7 +667,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;
@@ -1259,6 +1263,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))
     {
@@ -1317,7 +1323,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;
@@ -1326,10 +1332,15 @@ c_parser_gimple_switch_stmt (c_parser *parser, gimple_seq *seq)
 
   if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
     return;
-  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 %<{%>"))
     return;
 
@@ -1441,7 +1452,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();
