diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-03-23 19:42:19 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-03-23 19:42:19 +0100 |
commit | 048336099ee3c4e29510f140f5505ce2ad79bf55 (patch) | |
tree | 0578dd5aac3ba224d4ec3d82bfdd70c8163acfde | |
parent | 05aca4e73c2b4b18dcf617a8548e754161a28eea (diff) | |
download | gcc-048336099ee3c4e29510f140f5505ce2ad79bf55.zip gcc-048336099ee3c4e29510f140f5505ce2ad79bf55.tar.gz gcc-048336099ee3c4e29510f140f5505ce2ad79bf55.tar.bz2 |
re PR c++/70376 (OpenMP taskloop construct fails to instantiate copy constructor(same as Bug 48869))
PR c++/70376
* cp-gimplify.c (genericize_omp_for_stmt): Don't walk OMP_FOR_CLAUSES
for OMP_TASKLOOP here.
(cp_genericize_r): Handle OMP_TASKLOOP like OMP_TASK, except do call
genericize_omp_for_stmt instead of cp_walk_tree on OMP_BODY.
* testsuite/libgomp.c++/pr70376.C: New test.
From-SVN: r234437
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 15 | ||||
-rw-r--r-- | libgomp/ChangeLog | 5 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c++/pr70376.C | 20 |
4 files changed, 43 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 499b456..8b3918b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2016-03-23 Jakub Jelinek <jakub@redhat.com> + + PR c++/70376 + * cp-gimplify.c (genericize_omp_for_stmt): Don't walk OMP_FOR_CLAUSES + for OMP_TASKLOOP here. + (cp_genericize_r): Handle OMP_TASKLOOP like OMP_TASK, except do call + genericize_omp_for_stmt instead of cp_walk_tree on OMP_BODY. + 2016-03-23 Alexandre Oliva <aoliva@redhat.com> Jason Merrill <jason@redhat.com> Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 9bf2482..90b3464 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -386,7 +386,8 @@ genericize_omp_for_stmt (tree *stmt_p, int *walk_subtrees, void *data) tree clab = begin_bc_block (bc_continue, locus); cp_walk_tree (&OMP_FOR_BODY (stmt), cp_genericize_r, data, NULL); - cp_walk_tree (&OMP_FOR_CLAUSES (stmt), cp_genericize_r, data, NULL); + if (TREE_CODE (stmt) != OMP_TASKLOOP) + cp_walk_tree (&OMP_FOR_CLAUSES (stmt), cp_genericize_r, data, NULL); cp_walk_tree (&OMP_FOR_INIT (stmt), cp_genericize_r, data, NULL); cp_walk_tree (&OMP_FOR_COND (stmt), cp_genericize_r, data, NULL); cp_walk_tree (&OMP_FOR_INCR (stmt), cp_genericize_r, data, NULL); @@ -1272,7 +1273,9 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) if (TREE_CODE (d) == VAR_DECL) gcc_assert (CP_DECL_THREAD_LOCAL_P (d) == DECL_THREAD_LOCAL_P (d)); } - else if (TREE_CODE (stmt) == OMP_PARALLEL || TREE_CODE (stmt) == OMP_TASK) + else if (TREE_CODE (stmt) == OMP_PARALLEL + || TREE_CODE (stmt) == OMP_TASK + || TREE_CODE (stmt) == OMP_TASKLOOP) { struct cp_genericize_omp_taskreg omp_ctx; tree c, decl; @@ -1312,7 +1315,10 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) default: break; } - cp_walk_tree (&OMP_BODY (stmt), cp_genericize_r, data, NULL); + if (TREE_CODE (stmt) == OMP_TASKLOOP) + genericize_omp_for_stmt (stmt_p, walk_subtrees, data); + else + cp_walk_tree (&OMP_BODY (stmt), cp_genericize_r, data, NULL); wtd->omp_ctx = omp_ctx.outer; splay_tree_delete (omp_ctx.variables); } @@ -1380,8 +1386,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) genericize_break_stmt (stmt_p); else if (TREE_CODE (stmt) == OMP_FOR || TREE_CODE (stmt) == OMP_SIMD - || TREE_CODE (stmt) == OMP_DISTRIBUTE - || TREE_CODE (stmt) == OMP_TASKLOOP) + || TREE_CODE (stmt) == OMP_DISTRIBUTE) genericize_omp_for_stmt (stmt_p, walk_subtrees, data); else if ((flag_sanitize & (SANITIZE_NULL | SANITIZE_ALIGNMENT | SANITIZE_VPTR)) diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 12d7834..cb8c98e 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2016-03-23 Jakub Jelinek <jakub@redhat.com> + + PR c++/70376 + * testsuite/libgomp.c++/pr70376.C: New test. + 2016-03-23 Tom de Vries <tom@codesourcery.com> * testsuite/libgomp.oacc-fortran/reduction-2.f90: Add missing diff --git a/libgomp/testsuite/libgomp.c++/pr70376.C b/libgomp/testsuite/libgomp.c++/pr70376.C new file mode 100644 index 0000000..595c2cc --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/pr70376.C @@ -0,0 +1,20 @@ +// PR c++/70376 +// { dg-do link } + +template <typename T> +struct A +{ + A() { } + A(const A&) { } + void foo() { } +}; + +int +main () +{ + A<int> a; + #pragma omp taskloop + for (int i = 0; i < 64; i++) + a.foo(); + return 0; +} |