aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-23 19:42:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-03-23 19:42:19 +0100
commit048336099ee3c4e29510f140f5505ce2ad79bf55 (patch)
tree0578dd5aac3ba224d4ec3d82bfdd70c8163acfde
parent05aca4e73c2b4b18dcf617a8548e754161a28eea (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/cp-gimplify.c15
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.c++/pr70376.C20
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;
+}