re PR c++/31598 (g++ does not accept some OpenMP code)
authorJakub Jelinek <jakub@redhat.com>
Thu, 26 Apr 2007 07:32:27 +0000 (09:32 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 26 Apr 2007 07:32:27 +0000 (09:32 +0200)
PR c++/31598
* tree-inline.c (copy_body_r): Don't touch TREE_TYPE of OMP_CLAUSE.

* semantics.c (finish_omp_clauses): Don't create CP_OMP_CLAUSE_INFO
for type dependent OMP_CLAUSE_DECLs.

* g++.dg/gomp/pr31598.C: New test.

From-SVN: r124178

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr31598.C [new file with mode: 0644]
gcc/tree-inline.c

index b99d527209196dbacb3a41f977712dd21966b52c..bc48621e093326536c901a9fd694b27db646299b 100644 (file)
@@ -1,5 +1,8 @@
 2007-04-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/31598
+       * tree-inline.c (copy_body_r): Don't touch TREE_TYPE of OMP_CLAUSE.
+
        PR tree-optimization/30558
        * tree-eh.c (lower_eh_filter): If EH_FILTER_MUST_NOT_THROW
        clear this_state.prev_try.
index cb9840f434298acb6210c6638f4016da2a4b686c..6fea3c6b649f63fa2e35fdc56f9652bab8011369 100644 (file)
@@ -1,3 +1,9 @@
+2007-04-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/31598
+       * semantics.c (finish_omp_clauses): Don't create CP_OMP_CLAUSE_INFO
+       for type dependent OMP_CLAUSE_DECLs.
+
 2007-04-24  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/31338
index c683ba298ff857f4120f7e3c2d21558440112788..a920bfb6ce7fae8743ddc044e87f4928a1259dd5 100644 (file)
@@ -3627,7 +3627,8 @@ finish_omp_clauses (tree clauses)
         Save the results, because later we won't be in the right context
         for making these queries.  */
       if (CLASS_TYPE_P (inner_type)
-         && (need_default_ctor || need_copy_ctor || need_copy_assignment))
+         && (need_default_ctor || need_copy_ctor || need_copy_assignment)
+         && !type_dependent_expression_p (t))
        {
          int save_errorcount = errorcount;
          tree info;
index d75284ce407c552ca74f5c18c40a428fc5d82a5a..4667c9da9b78c04933c8ba8bebcc1b5c5d456279 100644 (file)
@@ -1,5 +1,8 @@
 2007-04-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/31598
+       * g++.dg/gomp/pr31598.C: New test.
+
        PR tree-optimization/30558
        * g++.dg/gomp/pr30558.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/gomp/pr31598.C b/gcc/testsuite/g++.dg/gomp/pr31598.C
new file mode 100644 (file)
index 0000000..3ebcead
--- /dev/null
@@ -0,0 +1,59 @@
+// PR c++/31598
+// { dg-do compile }
+//
+// Copyright (C) 2007 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo
+//   16 Apr 2007 <Theodore.Papadopoulo@sophia.inria.fr>
+
+int i;
+template <typename> struct A { A() {} };
+template <typename> struct C { C() { i++; } C(const C &) { i += 2; } };
+struct D { D() {} };
+
+struct M { typedef double E; };
+
+template <typename T>
+struct R
+{
+  R()
+  {
+    typedef A<typename T::E> B;
+    B b;
+    #pragma omp parallel for firstprivate(b) schedule(guided)
+      for (int t = 0; t < 10; ++t)
+       ;
+  }
+};
+
+template <typename T>
+struct S
+{
+  S()
+  {
+    typedef C<typename T::E> B;
+    B b;
+    #pragma omp parallel for firstprivate(b)
+      for (int t = 0; t < 10; ++t)
+       ;
+  }
+};
+
+struct U
+{
+  U()
+  {
+    D b;
+    #pragma omp parallel for firstprivate(b)
+      for (int t = 0; t < 10; ++t)
+       ;
+  }
+};
+
+int
+main ()
+{
+  R<M> r;
+  S<M> s;
+  U u;
+  return 0;
+}
index ff76b7557c1a291075d36b93ba00ad98619f4fa3..77d3864605438b4c4d8985f9ac17c72453f786f5 100644 (file)
@@ -731,7 +731,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
            (NULL_TREE,
             id->eh_region_offset + TREE_INT_CST_LOW (TREE_OPERAND (*tp, 0)));
 
-      if (!GIMPLE_TUPLE_P (*tp))
+      if (!GIMPLE_TUPLE_P (*tp) && TREE_CODE (*tp) != OMP_CLAUSE)
        TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
 
       /* The copied TARGET_EXPR has never been expanded, even if the