This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C PATCH] Fix error recovery ICEs (PR c/83595)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, Marek Polacek <polacek at redhat dot com>, David Malcolm <dmalcolm at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 30 Dec 2017 20:37:25 +0100
- Subject: [C PATCH] Fix error recovery ICEs (PR c/83595)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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