Commit 443679ae by Jason Merrill Committed by Jason Merrill

re PR c++/53565 (FAIL: libgomp.c++/for-7.C)

	PR c++/53565
	* pt.c (tsubst_omp_for_iterator): Simplify DECL_EXPR handling.
	(tsubst_expr) [OMP_FOR]: Here, too.

From-SVN: r188939
parent 85d91748
2012-06-25 Jason Merrill <jason@redhat.com>
PR c++/53565
* pt.c (tsubst_omp_for_iterator): Simplify DECL_EXPR handling.
(tsubst_expr) [OMP_FOR]: Here, too.
2012-06-25 Jakub Jelinek <jakub@redhat.com> 2012-06-25 Jakub Jelinek <jakub@redhat.com>
PR c++/53594 PR c++/53594
......
...@@ -12659,22 +12659,24 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv, ...@@ -12659,22 +12659,24 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
#define RECUR(NODE) \ #define RECUR(NODE) \
tsubst_expr ((NODE), args, complain, in_decl, \ tsubst_expr ((NODE), args, complain, in_decl, \
integral_constant_expression_p) integral_constant_expression_p)
tree decl, init, cond, incr, auto_node; tree decl, init, cond, incr;
bool init_decl;
init = TREE_VEC_ELT (OMP_FOR_INIT (t), i); init = TREE_VEC_ELT (OMP_FOR_INIT (t), i);
gcc_assert (TREE_CODE (init) == MODIFY_EXPR); gcc_assert (TREE_CODE (init) == MODIFY_EXPR);
decl = RECUR (TREE_OPERAND (init, 0)); decl = TREE_OPERAND (init, 0);
init = TREE_OPERAND (init, 1); init = TREE_OPERAND (init, 1);
auto_node = type_uses_auto (TREE_TYPE (decl)); /* Do this before substituting into decl to handle 'auto'. */
if (auto_node && init) init_decl = (init && TREE_CODE (init) == DECL_EXPR);
init = RECUR (init);
decl = RECUR (decl);
if (init_decl)
{ {
tree init_expr = init; gcc_assert (!processing_template_decl);
if (TREE_CODE (init_expr) == DECL_EXPR) init = DECL_INITIAL (decl);
init_expr = DECL_INITIAL (DECL_EXPR_DECL (init_expr)); DECL_INITIAL (decl) = NULL_TREE;
init_expr = RECUR (init_expr);
TREE_TYPE (decl)
= do_auto_deduction (TREE_TYPE (decl), init_expr, auto_node);
} }
gcc_assert (!type_dependent_expression_p (decl)); gcc_assert (!type_dependent_expression_p (decl));
if (!CLASS_TYPE_P (TREE_TYPE (decl))) if (!CLASS_TYPE_P (TREE_TYPE (decl)))
...@@ -12695,7 +12697,7 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv, ...@@ -12695,7 +12697,7 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
return; return;
} }
if (init && TREE_CODE (init) != DECL_EXPR) if (init && !init_decl)
{ {
tree c; tree c;
for (c = *clauses; c ; c = OMP_CLAUSE_CHAIN (c)) for (c = *clauses; c ; c = OMP_CLAUSE_CHAIN (c))
...@@ -13189,34 +13191,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, ...@@ -13189,34 +13191,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
condv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t))); condv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t)));
incrv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t))); incrv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t)));
stmt = begin_omp_structured_block ();
for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (t)); i++) for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (t)); i++)
tsubst_omp_for_iterator (t, i, declv, initv, condv, incrv, tsubst_omp_for_iterator (t, i, declv, initv, condv, incrv,
&clauses, args, complain, in_decl, &clauses, args, complain, in_decl,
integral_constant_expression_p); integral_constant_expression_p);
stmt = begin_omp_structured_block ();
for (i = 0; i < TREE_VEC_LENGTH (initv); i++)
if (TREE_VEC_ELT (initv, i) == NULL
|| TREE_CODE (TREE_VEC_ELT (initv, i)) != DECL_EXPR)
TREE_VEC_ELT (initv, i) = RECUR (TREE_VEC_ELT (initv, i));
else if (CLASS_TYPE_P (TREE_TYPE (TREE_VEC_ELT (initv, i))))
{
tree init = RECUR (TREE_VEC_ELT (initv, i));
gcc_assert (init == TREE_VEC_ELT (declv, i));
TREE_VEC_ELT (initv, i) = NULL_TREE;
}
else
{
tree decl_expr = TREE_VEC_ELT (initv, i);
tree init = DECL_INITIAL (DECL_EXPR_DECL (decl_expr));
gcc_assert (init != NULL);
TREE_VEC_ELT (initv, i) = RECUR (init);
DECL_INITIAL (DECL_EXPR_DECL (decl_expr)) = NULL;
RECUR (decl_expr);
DECL_INITIAL (DECL_EXPR_DECL (decl_expr)) = init;
}
pre_body = push_stmt_list (); pre_body = push_stmt_list ();
RECUR (OMP_FOR_PRE_BODY (t)); RECUR (OMP_FOR_PRE_BODY (t));
pre_body = pop_stmt_list (pre_body); pre_body = pop_stmt_list (pre_body);
......
...@@ -26,8 +26,8 @@ template <typename T> ...@@ -26,8 +26,8 @@ template <typename T>
void void
f3 (void) f3 (void)
{ {
#pragma omp for // { dg-error "forbids incrementing a pointer of type" } #pragma omp for
for (T q = T (p); q < T (p + 4); q++) for (T q = T (p); q < T (p + 4); q++) // { dg-error "forbids incrementing a pointer of type" }
; ;
} }
......
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