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
This commit is contained in:
Jakub Jelinek 2015-06-17 20:01:05 +02:00 committed by Jakub Jelinek
parent 8c8b9f3265
commit 64b5fcfa3b
4 changed files with 87 additions and 13 deletions

View File

@ -1,3 +1,8 @@
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>
* cp-lang.c (cxx_dwarf_name): Use anon_aggrname_p.
@ -7,7 +12,6 @@
* pt.c (push_template_decl_real): Likewise.
* name-lookup.c (make_anon_name): Use anon_aggrname_format.
2015-06-17 Andrew MacLeod <amacleod@redhat.com>
* call.c: Do not include input.h, line-map.h or is-a.h.

View File

@ -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. */
static tree
@ -13520,16 +13546,23 @@ tsubst_omp_clauses (tree clauses, bool declare_simd,
case OMP_CLAUSE_FIRSTPRIVATE:
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:
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_NUM_THREADS:
case OMP_CLAUSE_SCHEDULE:
case OMP_CLAUSE_COLLAPSE:
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_DIST_SCHEDULE:
case OMP_CLAUSE_NUM_TEAMS:
@ -13556,20 +13589,17 @@ tsubst_omp_clauses (tree clauses, bool declare_simd,
else
gcc_assert (identifier_p (placeholder));
}
OMP_CLAUSE_OPERAND (nc, 0)
= tsubst_expr (OMP_CLAUSE_OPERAND (oc, 0), args, complain,
in_decl, /*integral_constant_expression_p=*/false);
OMP_CLAUSE_DECL (nc) = tsubst_copy (OMP_CLAUSE_DECL (oc), args,
complain, in_decl);
break;
case OMP_CLAUSE_LINEAR:
case OMP_CLAUSE_ALIGNED:
OMP_CLAUSE_OPERAND (nc, 0)
= tsubst_expr (OMP_CLAUSE_OPERAND (oc, 0), args, complain,
in_decl, /*integral_constant_expression_p=*/false);
OMP_CLAUSE_DECL (nc) = tsubst_copy (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);
break;
case OMP_CLAUSE_NOWAIT:
case OMP_CLAUSE_ORDERED:
case OMP_CLAUSE_DEFAULT:

View File

@ -1,5 +1,8 @@
2015-06-17 Jakub Jelinek <jakub@redhat.com>
PR c++/66571
* g++.dg/gomp/pr66571-1.C: New test.
PR middle-end/66429
* c-c++-common/gomp/pr66429.c: New test.

View File

@ -0,0 +1,37 @@
// 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);
}