This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C PATCH] Fix error recovery ICEs (PR c/83595)


Hi!

As the patch shows, in lots of spots the C FE can return a c_expr
with error_mark_node value, but uninitialized locations, so if something
calls expr.get_location (), it can ICE.

Other spots are already using the set_error method which sets the value
to error_mark_node and in addition to that clears the locations.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-12-30  Jakub Jelinek  <jakub@redhat.com>

	PR c/83595
	* c-parser.c (c_parser_braced_init, c_parser_initelt,
	c_parser_conditional_expression, c_parser_cast_expression,
	c_parser_sizeof_expression, c_parser_alignof_expression,
	c_parser_postfix_expression, c_parser_omp_declare_reduction,
	c_parser_transaction_expression): Use set_error () method instead
	of setting value member to error_mark_node.

	* gcc.dg/pr83595.c: New test.

--- gcc/c/c-parser.c.jj	2017-12-22 11:38:07.781178925 +0100
+++ gcc/c/c-parser.c	2017-12-30 15:22:25.638774453 +0100
@@ -4582,7 +4582,7 @@ c_parser_braced_init (c_parser *parser,
   c_token *next_tok = c_parser_peek_token (parser);
   if (next_tok->type != CPP_CLOSE_BRACE)
     {
-      ret.value = error_mark_node;
+      ret.set_error ();
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
       braces.skip_until_found_close (parser);
@@ -4649,7 +4649,7 @@ c_parser_initelt (c_parser *parser, stru
 	      else
 		{
 		  struct c_expr init;
-		  init.value = error_mark_node;
+		  init.set_error ();
 		  init.original_code = ERROR_MARK;
 		  init.original_type = NULL;
 		  c_parser_error (parser, "expected identifier");
@@ -4785,7 +4785,7 @@ c_parser_initelt (c_parser *parser, stru
 	      else
 		{
 		  struct c_expr init;
-		  init.value = error_mark_node;
+		  init.set_error ();
 		  init.original_code = ERROR_MARK;
 		  init.original_type = NULL;
 		  c_parser_error (parser, "expected %<=%>");
@@ -6693,7 +6693,7 @@ c_parser_conditional_expression (c_parse
   if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
     {
       c_inhibit_evaluation_warnings -= cond.value == truthvalue_true_node;
-      ret.value = error_mark_node;
+      ret.set_error ();
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
       return ret;
@@ -7071,7 +7071,7 @@ c_parser_cast_expression (c_parser *pars
       parens.skip_until_found_close (parser);
       if (type_name == NULL)
 	{
-	  ret.value = error_mark_node;
+	  ret.set_error ();
 	  ret.original_code = ERROR_MARK;
 	  ret.original_type = NULL;
 	  return ret;
@@ -7297,7 +7297,7 @@ c_parser_sizeof_expression (c_parser *pa
 	  struct c_expr ret;
 	  c_inhibit_evaluation_warnings--;
 	  in_sizeof--;
-	  ret.value = error_mark_node;
+	  ret.set_error ();
 	  ret.original_code = ERROR_MARK;
 	  ret.original_type = NULL;
 	  return ret;
@@ -7383,7 +7383,7 @@ c_parser_alignof_expression (c_parser *p
 	  struct c_expr ret;
 	  c_inhibit_evaluation_warnings--;
 	  in_alignof--;
-	  ret.value = error_mark_node;
+	  ret.set_error ();
 	  ret.original_code = ERROR_MARK;
 	  ret.original_type = NULL;
 	  return ret;
@@ -7838,7 +7838,7 @@ c_parser_postfix_expression (c_parser *p
 	  && !targetm.fixed_point_supported_p ())
 	{
 	  error_at (loc, "fixed-point types not supported for this target");
-	  expr.value = error_mark_node;
+	  expr.set_error ();
 	}
       break;
     case CPP_CHAR:
@@ -17748,7 +17748,7 @@ c_parser_omp_declare_reduction (c_parser
       struct c_expr initializer;
       tree omp_priv = NULL_TREE, omp_orig = NULL_TREE;
       bool bad = false;
-      initializer.value = error_mark_node;
+      initializer.set_error ();
       if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
 	bad = true;
       else if (c_parser_next_token_is (parser, CPP_NAME)
@@ -18305,7 +18305,7 @@ c_parser_transaction_expression (c_parse
   else
     {
      error:
-      ret.value = error_mark_node;
+      ret.set_error ();
       ret.original_code = ERROR_MARK;
       ret.original_type = NULL;
     }
--- gcc/testsuite/gcc.dg/pr83595.c.jj	2017-12-30 15:23:43.864797406 +0100
+++ gcc/testsuite/gcc.dg/pr83595.c	2017-12-30 15:23:24.898791837 +0100
@@ -0,0 +1,9 @@
+/* PR c/83595 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void
+foo ()
+{
+  (())((int){0);	/* { dg-error "expected expression before" } */
+}

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]