aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-01-01 00:52:41 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-01 00:52:41 +0100
commit913884f792bf4ba684ef4513cf79168d37d86e92 (patch)
tree9c53b4ced0d7b041c52b65821e840ca33e21a678
parent0f3f0e4e97a0d564f87cbd8a7dfdaf9be3665fe3 (diff)
downloadgcc-913884f792bf4ba684ef4513cf79168d37d86e92.zip
gcc-913884f792bf4ba684ef4513cf79168d37d86e92.tar.gz
gcc-913884f792bf4ba684ef4513cf79168d37d86e92.tar.bz2
re PR c/83595 (ICE: in linemap_macro_map_lookup, at libcpp/line-map.c:1008 on invalid code)
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. From-SVN: r256054
-rw-r--r--gcc/c/ChangeLog10
-rw-r--r--gcc/c/c-parser.c20
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr83595.c9
4 files changed, 32 insertions, 10 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index f76110a..8e6e1fe 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,13 @@
+2018-01-01 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.
+
2017-12-28 Michael Meissner <meissner@linux.vnet.ibm.com>
* c-decl.c (header_for_builtin_fn): Add integer rounding _Float<N>
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 05d1e0f..c27fdaf 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -4582,7 +4582,7 @@ c_parser_braced_init (c_parser *parser, tree type, bool nested_p,
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, struct obstack * braced_init_obstack)
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, struct obstack * braced_init_obstack)
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_parser *parser, struct c_expr *after,
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 *parser, struct c_expr *after)
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 *parser)
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 *parser)
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 *parser)
&& !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 *parser, enum pragma_context context)
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_parser *parser, enum rid keyword)
else
{
error:
- ret.value = error_mark_node;
+ ret.set_error ();
ret.original_code = ERROR_MARK;
ret.original_type = NULL;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8b5c062..a9b2008 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2018-01-01 Jakub Jelinek <jakub@redhat.com>
+ PR c/83595
+ * gcc.dg/pr83595.c: New test.
+
PR middle-end/83608
* g++.dg/opt/pr83608.C: New test.
diff --git a/gcc/testsuite/gcc.dg/pr83595.c b/gcc/testsuite/gcc.dg/pr83595.c
new file mode 100644
index 0000000..b67970e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr83595.c
@@ -0,0 +1,9 @@
+/* PR c/83595 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void
+foo ()
+{
+ (())((int){0); /* { dg-error "expected expression before" } */
+}