From 1562e1fee7c5eec57c05a37c7dca6d4c333dbf7f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 26 Apr 2006 10:23:12 +0200 Subject: [PATCH] re PR c/25996 ([gomp] ICE on undefined iteration variable) PR c/25996 * c-parser.c (c_parser_omp_for_loop): Don't call c_finish_omp_for if either decl or init is error_mark_node. * gcc.dg/gomp/pr25996.c: New test. * g++.dg/gomp/pr25996.C: New test. From-SVN: r113269 --- gcc/ChangeLog | 4 ++++ gcc/c-parser.c | 2 +- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/gomp/pr25996.C | 32 +++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/gomp/pr25996.c | 32 +++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr25996.C create mode 100644 gcc/testsuite/gcc.dg/gomp/pr25996.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28f8d3f707b..0a3504d15bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2006-04-26 Jakub Jelinek + PR c/25996 + * c-parser.c (c_parser_omp_for_loop): Don't call c_finish_omp_for if + either decl or init is error_mark_node. + PR middle-end/25989 * tree-flow.h (struct omp_region): Add sched_kind. * omp-low.c (expand_parallel_call): Use region->inner->sched_kind diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 0c90fa84bd8..8cad3108243 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -7379,7 +7379,7 @@ c_parser_omp_for_loop (c_parser *parser) /* Only bother calling c_finish_omp_for if we havn't already generated an error from the initialization parsing. */ - if (decl != NULL) + if (decl != NULL && decl != error_mark_node && init != error_mark_node) return c_finish_omp_for (loc, decl, init, cond, incr, body, NULL); return NULL; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4f4944eff2f..c59270d4be8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-04-26 Jakub Jelinek + + PR c/25996 + * gcc.dg/gomp/pr25996.c: New test. + * g++.dg/gomp/pr25996.C: New test. + 2006-04-25 Richard Sandiford PR rtl-optimization/26725 diff --git a/gcc/testsuite/g++.dg/gomp/pr25996.C b/gcc/testsuite/g++.dg/gomp/pr25996.C new file mode 100644 index 00000000000..6b50ff03032 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr25996.C @@ -0,0 +1,32 @@ +// PR c/25996 + +void +test1 (void) +{ +#pragma omp for + for (i = 0; i < 1; ++i); // { dg-error "not declared|expected iteration decl" } +} + +void +test2 (void) +{ + int i; +#pragma omp for + for (i = j; i < 1; ++i); // { dg-error "not declared|expected iteration decl" } +} + +void +test3 (void) +{ + int i; +#pragma omp for + for (i = 0; i < j; ++i); // { dg-error "not declared|invalid controlling predicate" } +} + +void +test4 (void) +{ + int i; +#pragma omp for + for (i = 0; i < 10; i += j); // { dg-error "not declared|invalid increment expression" } +} diff --git a/gcc/testsuite/gcc.dg/gomp/pr25996.c b/gcc/testsuite/gcc.dg/gomp/pr25996.c new file mode 100644 index 00000000000..d58c9a1c36d --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/pr25996.c @@ -0,0 +1,32 @@ +/* PR c/25996 */ + +void +test1 (void) +{ +#pragma omp for + for (i = 0; i < 1; ++i); /* { dg-error "undeclared|for each function" } */ +} + +void +test2 (void) +{ + int i; +#pragma omp for + for (i = j; i < 1; ++i); /* { dg-error "undeclared" } */ +} + +void +test3 (void) +{ + int i; +#pragma omp for + for (i = 0; i < j; ++i); /* { dg-error "undeclared|invalid controlling predicate" } */ +} + +void +test4 (void) +{ + int i; +#pragma omp for + for (i = 0; i < 10; i += j); /* { dg-error "undeclared|invalid increment expression" } */ +}