diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c-omp.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/for-19.C | 41 |
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05b970b..5d7f4f0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2008-12-01 Jakub Jelinek <jakub@redhat.com> + PR c++/38348 + * c-omp.c (c_finish_omp_for): Only transform pointer + ++ or -- into MODIFY_EXPR if second argument is non-NULL. + PR rtl-optimization/38245 * tree-vrp.c (abs_extent_range): New function. (extract_range_from_binary_expr): Compute range diff --git a/gcc/c-omp.c b/gcc/c-omp.c index b06c830..3be3729 100644 --- a/gcc/c-omp.c +++ b/gcc/c-omp.c @@ -357,7 +357,8 @@ c_finish_omp_for (location_t locus, tree declv, tree initv, tree condv, break; incr_ok = true; - if (POINTER_TYPE_P (TREE_TYPE (decl))) + if (POINTER_TYPE_P (TREE_TYPE (decl)) + && TREE_OPERAND (incr, 1)) { tree t = fold_convert (sizetype, TREE_OPERAND (incr, 1)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 88adf43..1bc5714 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2008-12-01 Jakub Jelinek <jakub@redhat.com> + PR c++/38348 + * g++.dg/gomp/for-19.C: New test. + PR rtl-optimization/38245 * gcc.dg/pr38245-1.c: New test. * gcc.dg/pr38245-2.c: New test. diff --git a/gcc/testsuite/g++.dg/gomp/for-19.C b/gcc/testsuite/g++.dg/gomp/for-19.C new file mode 100644 index 0000000..1929e45 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-19.C @@ -0,0 +1,41 @@ +// PR c++/38348 +// { dg-do compile } +// { dg-options "-fopenmp" } + +const char *p = "abcde"; + +template <typename T> +void +f1 (void) +{ +#pragma omp for // { dg-error "forbids incrementing a pointer of type" } + for (void *q = (void *)p; q < (void *) (p + 4); q++) // { dg-error "forbids incrementing a pointer of type" } + ; +} + +template <typename T> +void +f2 (void) +{ +#pragma omp for + for (const char *q = p; q < p + 4; q++) + ; +} + +template <typename T> +void +f3 (void) +{ +#pragma omp for // { dg-error "forbids incrementing a pointer of type" } + for (T q = T (p); q < T (p + 4); q++) + ; +} + +int +main (void) +{ + f1 <int> (); // { dg-message "instantiated from here" } + f2 <int> (); + f3 <const char *> (); + f3 <void *> (); // { dg-message "instantiated from here" } +} |