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 <ja...@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