Commit 64b5fcfa by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/66571 (Template substitution causes some OpenMP rejects-valid)

	PR c++/66571
	* pt.c (tsubst_omp_clause_decl): New function.
	(tsubst_omp_clauses): Use it or tsubst_copy instead of
	tsubst_expr on OMP_CLAUSE_DECL.

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

From-SVN: r224569
parent 8c8b9f32
2015-06-17 Jakub Jelinek <jakub@redhat.com>
PR c++/66571
* g++.dg/gomp/pr66571-1.C: New test.
2015-06-17 Andrew MacLeod <amacleod@redhat.com> 2015-06-17 Andrew MacLeod <amacleod@redhat.com>
* cp-lang.c (cxx_dwarf_name): Use anon_aggrname_p. * cp-lang.c (cxx_dwarf_name): Use anon_aggrname_p.
...@@ -7,7 +12,6 @@ ...@@ -7,7 +12,6 @@
* pt.c (push_template_decl_real): Likewise. * pt.c (push_template_decl_real): Likewise.
* name-lookup.c (make_anon_name): Use anon_aggrname_format. * name-lookup.c (make_anon_name): Use anon_aggrname_format.
2015-06-17 Andrew MacLeod <amacleod@redhat.com> 2015-06-17 Andrew MacLeod <amacleod@redhat.com>
* call.c: Do not include input.h, line-map.h or is-a.h. * call.c: Do not include input.h, line-map.h or is-a.h.
......
...@@ -13489,6 +13489,32 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -13489,6 +13489,32 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
} }
} }
/* Helper function for tsubst_omp_clauses, used for instantiation of
OMP_CLAUSE_DECL of clauses that handles also OpenMP array sections
represented with TREE_LIST. */
static tree
tsubst_omp_clause_decl (tree decl, tree args, tsubst_flags_t complain,
tree in_decl)
{
if (TREE_CODE (decl) == TREE_LIST)
{
tree low_bound
= tsubst_expr (TREE_PURPOSE (decl), args, complain, in_decl,
/*integral_constant_expression_p=*/false);
tree length = tsubst_expr (TREE_VALUE (decl), args, complain, in_decl,
/*integral_constant_expression_p=*/false);
tree chain = tsubst_omp_clause_decl (TREE_CHAIN (decl), args, complain,
in_decl);
if (TREE_PURPOSE (decl) == low_bound
&& TREE_VALUE (decl) == length
&& TREE_CHAIN (decl) == chain)
return decl;
return tree_cons (low_bound, length, chain);
}
return tsubst_copy (decl, args, complain, in_decl);
}
/* Like tsubst_copy, but specifically for OpenMP clauses. */ /* Like tsubst_copy, but specifically for OpenMP clauses. */
static tree static tree
...@@ -13520,16 +13546,23 @@ tsubst_omp_clauses (tree clauses, bool declare_simd, ...@@ -13520,16 +13546,23 @@ tsubst_omp_clauses (tree clauses, bool declare_simd,
case OMP_CLAUSE_FIRSTPRIVATE: case OMP_CLAUSE_FIRSTPRIVATE:
case OMP_CLAUSE_COPYIN: case OMP_CLAUSE_COPYIN:
case OMP_CLAUSE_COPYPRIVATE: 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:
case OMP_CLAUSE_MAP:
OMP_CLAUSE_DECL (nc)
= tsubst_omp_clause_decl (OMP_CLAUSE_DECL (oc), args, complain,
in_decl);
break;
case OMP_CLAUSE_IF: case OMP_CLAUSE_IF:
case OMP_CLAUSE_NUM_THREADS: case OMP_CLAUSE_NUM_THREADS:
case OMP_CLAUSE_SCHEDULE: case OMP_CLAUSE_SCHEDULE:
case OMP_CLAUSE_COLLAPSE: case OMP_CLAUSE_COLLAPSE:
case OMP_CLAUSE_FINAL: case OMP_CLAUSE_FINAL:
case OMP_CLAUSE_DEPEND:
case OMP_CLAUSE_FROM:
case OMP_CLAUSE_TO:
case OMP_CLAUSE_UNIFORM:
case OMP_CLAUSE_MAP:
case OMP_CLAUSE_DEVICE: case OMP_CLAUSE_DEVICE:
case OMP_CLAUSE_DIST_SCHEDULE: case OMP_CLAUSE_DIST_SCHEDULE:
case OMP_CLAUSE_NUM_TEAMS: case OMP_CLAUSE_NUM_TEAMS:
...@@ -13556,20 +13589,17 @@ tsubst_omp_clauses (tree clauses, bool declare_simd, ...@@ -13556,20 +13589,17 @@ tsubst_omp_clauses (tree clauses, bool declare_simd,
else else
gcc_assert (identifier_p (placeholder)); gcc_assert (identifier_p (placeholder));
} }
OMP_CLAUSE_OPERAND (nc, 0) OMP_CLAUSE_DECL (nc) = tsubst_copy (OMP_CLAUSE_DECL (oc), args,
= tsubst_expr (OMP_CLAUSE_OPERAND (oc, 0), args, complain, complain, in_decl);
in_decl, /*integral_constant_expression_p=*/false);
break; break;
case OMP_CLAUSE_LINEAR: case OMP_CLAUSE_LINEAR:
case OMP_CLAUSE_ALIGNED: case OMP_CLAUSE_ALIGNED:
OMP_CLAUSE_OPERAND (nc, 0) OMP_CLAUSE_DECL (nc) = tsubst_copy (OMP_CLAUSE_DECL (oc), args,
= tsubst_expr (OMP_CLAUSE_OPERAND (oc, 0), args, complain, complain, in_decl);
in_decl, /*integral_constant_expression_p=*/false);
OMP_CLAUSE_OPERAND (nc, 1) OMP_CLAUSE_OPERAND (nc, 1)
= tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain, = tsubst_expr (OMP_CLAUSE_OPERAND (oc, 1), args, complain,
in_decl, /*integral_constant_expression_p=*/false); in_decl, /*integral_constant_expression_p=*/false);
break; break;
case OMP_CLAUSE_NOWAIT: case OMP_CLAUSE_NOWAIT:
case OMP_CLAUSE_ORDERED: case OMP_CLAUSE_ORDERED:
case OMP_CLAUSE_DEFAULT: case OMP_CLAUSE_DEFAULT:
......
2015-06-17 Jakub Jelinek <jakub@redhat.com> 2015-06-17 Jakub Jelinek <jakub@redhat.com>
PR c++/66571
* g++.dg/gomp/pr66571-1.C: New test.
PR middle-end/66429 PR middle-end/66429
* c-c++-common/gomp/pr66429.c: New test. * c-c++-common/gomp/pr66429.c: New test.
......
// PR c++/66571
// { dg-do compile }
// { dg-options "-fopenmp" }
template <typename T, typename U>
extern void bar (T, T, U);
template <typename T, typename U>
void
foo (T a, T b, U c)
{
#pragma omp parallel for simd shared (a, c) reduction (+:b)
for (int i = 0; i < 10; i++)
bar<T> (a, b, c);
#pragma omp target map(tofrom:a, c[0:5])
;
#pragma omp task depend(inout:c[4:2])
;
T d = a;
T e = b;
U f = c;
#pragma omp parallel for simd shared (d, f) reduction (+:e)
for (int i = 0; i < 10; i++)
bar<T> (d, e, f);
#pragma omp target map(tofrom:d, f[0:5])
;
#pragma omp task depend(inout:f[4:2])
;
}
void
baz ()
{
int a = 0, b = 0, cb[10] = {}, *c = cb;
foo <int, int *> (a, b, c);
foo <int &, int *&> (a, b, c);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment