gimple-parser.c (c_parser_gimple_binary_expression): Avoid building IL when arguments...
authorPrasad Ghangal <prasad.ghangal@gmail.com>
Fri, 10 Feb 2017 12:47:05 +0000 (12:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 10 Feb 2017 12:47:05 +0000 (12:47 +0000)
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

gcc/c/ChangeLog
gcc/c/gimple-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gimplefe-error-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gimplefe-error-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gimplefe-error-3.c [new file with mode: 0644]

index 95784d80212c5dbe0f012cfb868d85ae447edbad..fdf5046118179fd4d512778ef1f9a8fdfda18228 100644 (file)
@@ -1,3 +1,16 @@
+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.
+
 2017-02-09  Marek Polacek  <polacek@redhat.com>
 
        PR c/79428
index e167e420150424b364f0734fdac877f83547c88d..afa2e52b7a83a6808b5811f8a7b55c1c790bdea3 100644 (file)
@@ -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);
+       }
     }
 }
 
index d6cd7711a9a2b73e4b8d7cbdf6ca81535ee6446e..3cf1cb245746f936d20f90213ac29a5837423650 100644 (file)
@@ -1,3 +1,10 @@
+2017-02-10  Prasad Ghangal  <prasad.ghangal@gmail.com>
+       Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/gimplefe-error-1.c: New testcase.
+       * gcc.dg/gimplefe-error-2.c: New testcase.
+       * gcc.dg/gimplefe-error-3.c: New testcase.
+
 2017-02-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/79411
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-1.c b/gcc/testsuite/gcc.dg/gimplefe-error-1.c
new file mode 100644 (file)
index 0000000..5b870f1
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+void __GIMPLE () foo (int a)
+{
+bb_2:
+  a = *b; /* { dg-error "undeclared" } */
+
+bb_3:
+  return;
+}
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-2.c b/gcc/testsuite/gcc.dg/gimplefe-error-2.c
new file mode 100644 (file)
index 0000000..216623e
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+int __GIMPLE ()
+main (int argc, char * * argv)
+{
+
+bb_2:
+  switch (a) {default: L2; case 1: L0; case 2: L1; } /* { dg-error "undeclared" } */
+
+L0:
+  a = 0;
+  goto bb_6;
+
+L1:
+  a = 3;
+  goto L2;
+
+L2:
+  return a;
+}
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-3.c b/gcc/testsuite/gcc.dg/gimplefe-error-3.c
new file mode 100644 (file)
index 0000000..9209bba
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+int __GIMPLE foo()
+{
+  if (a != 2) /* { dg-error "undeclared" } */
+    goto bb1;
+  else
+    goto bb2;
+
+bb1:
+  a_1 = 10; /* { dg-error "undeclared" } */
+  return a_1;
+
+bb2:
+  return 1;
+}