re PR c++/70376 (OpenMP taskloop construct fails to instantiate copy constructor...
authorJakub Jelinek <jakub@redhat.com>
Wed, 23 Mar 2016 18:42:19 +0000 (19:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 23 Mar 2016 18:42:19 +0000 (19:42 +0100)
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

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/pr70376.C [new file with mode: 0644]

index 499b456..8b3918b 100644 (file)
@@ -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>
index 9bf2482..90b3464 100644 (file)
@@ -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))
index 12d7834..cb8c98e 100644 (file)
@@ -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 (file)
index 0000000..595c2cc
--- /dev/null
@@ -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;
+}