Hi!

I've merged trunk into gomp-4_1-branch up to r224573.
Unfortunately, the PR66571 patch doesn't really work on the branch where we
support privatization of non-static data members.  Therefore, I've committed
together with the merge following change plus another testcase that
covers the new clauses that previously didn't allow references.

2015-06-18  Jakub Jelinek  <ja...@redhat.com>

        PR c++/66571
        * pt.c (tsubst_omp_clause_decl): Use tsubst_expr instead of
        tsubst_copy.  Undo convert_from_reference if non-REFERENCE_REF_P
        became REFERENCE_REF_P after tsubst_expr.
        (tsubst_omp_clauses): Use tsubst_omp_clause_decl instead of
        tsubst_copy for OMP_CLAUSE_DECL on all clauses.  Remove earlier
        INDIRECT_REF adjustments in the allow_fields handling.

        * g++.dg/gomp/pr66571-2.C: New test.

--- gcc/cp/pt.c.jj      2015-06-17 21:21:10.000000000 +0200
+++ gcc/cp/pt.c 2015-06-18 10:57:22.750541798 +0200
@@ -13512,7 +13512,14 @@ tsubst_omp_clause_decl (tree decl, tree
        return decl;
       return tree_cons (low_bound, length, chain);
     }
-  return tsubst_copy (decl, args, complain, in_decl);
+  tree ret = tsubst_expr (decl, args, complain, in_decl,
+                         /*integral_constant_expression_p=*/false);
+  /* Undo convert_from_reference tsubst_expr could have called.  */
+  if (decl
+      && REFERENCE_REF_P (ret)
+      && !REFERENCE_REF_P (decl))
+    ret = TREE_OPERAND (ret, 0);
+  return ret;
 }
 
 /* Like tsubst_copy, but specifically for OpenMP clauses.  */
@@ -13547,9 +13554,6 @@ tsubst_omp_clauses (tree clauses, bool d
        case OMP_CLAUSE_COPYIN:
        case OMP_CLAUSE_COPYPRIVATE:
        case OMP_CLAUSE_UNIFORM:
-         OMP_CLAUSE_DECL (nc) = tsubst_copy (OMP_CLAUSE_DECL (oc), args,
-                                             complain, in_decl);
-         break;
        case OMP_CLAUSE_DEPEND:
        case OMP_CLAUSE_FROM:
        case OMP_CLAUSE_TO:
@@ -13593,13 +13597,15 @@ tsubst_omp_clauses (tree clauses, bool d
              else
                gcc_assert (identifier_p (placeholder));
            }
-         OMP_CLAUSE_DECL (nc) = tsubst_copy (OMP_CLAUSE_DECL (oc), args,
-                                             complain, in_decl);
+         OMP_CLAUSE_DECL (nc)
+           = tsubst_omp_clause_decl (OMP_CLAUSE_DECL (oc), args, complain,
+                                     in_decl);
          break;
        case OMP_CLAUSE_LINEAR:
        case OMP_CLAUSE_ALIGNED:
-         OMP_CLAUSE_DECL (nc) = tsubst_copy (OMP_CLAUSE_DECL (oc), args,
-                                             complain, in_decl);
+         OMP_CLAUSE_DECL (nc)
+           = tsubst_omp_clause_decl (OMP_CLAUSE_DECL (oc), args, complain,
+                                     in_decl);
          OMP_CLAUSE_OPERAND (nc, 1)
            = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain,
                           in_decl, /*integral_constant_expression_p=*/false);
@@ -13638,16 +13644,6 @@ tsubst_omp_clauses (tree clauses, bool d
                    == IDENTIFIER_NODE))
              {
                tree t = OMP_CLAUSE_DECL (nc);
-               if (TREE_CODE (t) == INDIRECT_REF)
-                 t = TREE_OPERAND (t, 0);
-               if (TREE_CODE (t) != COMPONENT_REF)
-                 {
-                   if (VAR_P (t)
-                       && DECL_LANG_SPECIFIC (t)
-                       && DECL_OMP_PRIVATIZED_MEMBER (t))
-                     OMP_CLAUSE_DECL (nc) = t;
-                   break;
-                 }
                tree v = t;
                while (v)
                  switch (TREE_CODE (v))
@@ -13677,14 +13673,11 @@ tsubst_omp_clauses (tree clauses, bool d
                     && DECL_OMP_PRIVATIZED_MEMBER (OMP_CLAUSE_DECL (oc)))
              {
                tree decl = OMP_CLAUSE_DECL (nc);
-               if (TREE_CODE (decl) == INDIRECT_REF)
-                 decl = TREE_OPERAND (decl, 0);
                if (VAR_P (decl))
                  {
                    if (!DECL_LANG_SPECIFIC (decl))
                      retrofit_lang_decl (decl);
                    DECL_OMP_PRIVATIZED_MEMBER (decl) = 1;
-                   OMP_CLAUSE_DECL (nc) = decl;
                  }
              }
            break;
--- gcc/testsuite/g++.dg/gomp/pr66571-2.C.jj    2015-06-18 11:05:17.837255437 
+0200
+++ gcc/testsuite/g++.dg/gomp/pr66571-2.C       2015-06-18 11:05:29.913070275 
+0200
@@ -0,0 +1,36 @@
+// PR c++/66571
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+template <typename T>
+extern void bar (T, T, T, T);
+
+template <typename T>
+void
+foo (T a, T b, T c, T d)
+{
+  #pragma omp parallel for simd private (a) firstprivate (b) lastprivate (c) 
linear (d:2)
+  for (int i = 0; i < 10; i++)
+    bar<T> (a, b, c, d), d += 2;
+  #pragma omp parallel private (c)
+    #pragma omp single copyprivate (c)
+      bar<T> (a, b, c, d);
+  T e = a;
+  T f = b;
+  T g = c;
+  T h = d;
+  #pragma omp parallel for simd private (e) firstprivate (f) lastprivate (g) 
linear (h:2)
+  for (int i = 0; i < 10; i++)
+    bar<T> (e, f, g, h), h += 2;
+  #pragma omp parallel private (g)
+    #pragma omp single copyprivate (g)
+      bar<T> (e, f, g, h);
+}
+
+void
+baz ()
+{
+  int a = 0, b = 0, c = 0, d = 0;
+  foo <int> (a, b, c, d);
+  foo <int &> (a, b, c, d);
+}

        Jakub

Reply via email to