diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-10-27 09:16:48 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-10-27 09:16:48 +0200 |
commit | 6b0f35299bd1468ebc13b900a73b7cac6181a2aa (patch) | |
tree | d3fb9325a061bdb52e21c910f125f8ec8d28c158 /gcc/testsuite | |
parent | 7473b8a90490e1dcd8fd5f7a92307d79fd2a5f8e (diff) | |
download | gcc-6b0f35299bd1468ebc13b900a73b7cac6181a2aa.zip gcc-6b0f35299bd1468ebc13b900a73b7cac6181a2aa.tar.gz gcc-6b0f35299bd1468ebc13b900a73b7cac6181a2aa.tar.bz2 |
openmp: Don't reject some valid initializers or conditions of non-rectangular loops [PR102854]
In C++, if an iterator has or might have (e.g. dependent type) class type we
remember the original init expressions and check those separately for presence
of iterators, because for class iterators we turn those into expressions that
always do contain reference to the current iterator. But this resulted in
rejecting valid non-rectangular loop where the dependent type is later instantiated
to an integral type.
Non-rectangular loops with class random access iterators remain broken, that is something
to be fixed incrementally.
2021-10-27 Jakub Jelinek <jakub@redhat.com>
PR c++/102854
gcc/c-family/
* c-common.h (c_omp_check_loop_iv_exprs): Add enum tree_code argument.
* c-omp.c (c_omp_check_loop_iv_r): For trees other than decls,
TREE_VEC, PLUS_EXPR, MINUS_EXPR, MULT_EXPR, POINTER_PLUS_EXPR or
conversions temporarily clear the 3rd bit from d->kind while walking
subtrees.
(c_omp_check_loop_iv_exprs): Add CODE argument. Or in 4 into data.kind
if possibly non-rectangular.
gcc/cp/
* semantics.c (handle_omp_for_class_iterator,
finish_omp_for): Adjust c_omp_check_loop_iv_exprs caller.
gcc/testsuite/
* g++.dg/gomp/loop-3.C: Don't expect some errors.
* g++.dg/gomp/loop-7.C: New test.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/loop-3.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/loop-7.C | 22 |
2 files changed, 28 insertions, 6 deletions
diff --git a/gcc/testsuite/g++.dg/gomp/loop-3.C b/gcc/testsuite/g++.dg/gomp/loop-3.C index 3806e1f..d9b8465 100644 --- a/gcc/testsuite/g++.dg/gomp/loop-3.C +++ b/gcc/testsuite/g++.dg/gomp/loop-3.C @@ -116,7 +116,7 @@ f1 (I<int> &x, I<int> &y, I<int> &u, I<int> &v) for (j = x; j < y; j++) ; #pragma omp for collapse(2) - for (i = x; i < y; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */ + for (i = x; i < y; i = i + 2) for (j = i; j < v; j += 2) ; #pragma omp for collapse(2) @@ -128,11 +128,11 @@ f1 (I<int> &x, I<int> &y, I<int> &u, I<int> &v) for (j = baz (&i); j < v; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */ ; #pragma omp for collapse(2) - for (i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */ + for (i = x; i < y; i++) for (j = v; j > i; j--) ; #pragma omp for collapse(2) - for (i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */ + for (i = x; i < y; i++) for (j = x; j < i; j++) ; #pragma omp for collapse(2) @@ -234,7 +234,7 @@ f2 (I<int> &x, I<int> &y, I<int> &u, I<int> &v) for (I<int> j = u; j < y; j += 2) ; #pragma omp for collapse(2) - for (I<int> i = x; i < y; i = i + 2) /* { dg-error "initializer expression refers to iteration variable" } */ + for (I<int> i = x; i < y; i = i + 2) for (I<int> j = i; j < v; j += 2) ; #pragma omp for collapse(2) @@ -246,11 +246,11 @@ f2 (I<int> &x, I<int> &y, I<int> &u, I<int> &v) for (I<int> j = baz (&i); j < v; j += 2) /* { dg-error "initializer expression refers to iteration variable" } */ ; #pragma omp for collapse(2) - for (I<int> i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */ + for (I<int> i = x; i < y; i++) for (I<int> j = v; j > i; j--) ; #pragma omp for collapse(2) - for (I<int> i = x; i < y; i++) /* { dg-error "condition expression refers to iteration variable" } */ + for (I<int> i = x; i < y; i++) for (I<int> j = x; j < i; j++) ; #pragma omp for collapse(2) diff --git a/gcc/testsuite/g++.dg/gomp/loop-7.C b/gcc/testsuite/g++.dg/gomp/loop-7.C new file mode 100644 index 0000000..9466c1c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/loop-7.C @@ -0,0 +1,22 @@ +// PR c++/102854 +// { dg-do compile } + +template <typename T> +void +foo (T N, T M) +{ + #pragma omp parallel for collapse(2) + for (T i = 0; i < N; ++i) + for (T k = i; k < M; ++k) + ; + #pragma omp parallel for collapse(2) + for (T i = 0; i < N; ++i) + for (T k = i; k < 2 * i; ++k) + ; +} + +void +bar () +{ + foo (5, 10); +} |