re PR c++/32177 (g++ crashes on some valid OpenMP code)

PR c++/32177
	* semantics.c (finish_omp_for): Call fold_build_cleanup_point_expr
	on init, the non-decl cond operand and increment value.

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

From-SVN: r125544
This commit is contained in:
Jakub Jelinek 2007-06-08 01:11:23 +02:00 committed by Jakub Jelinek
parent 1579e8d235
commit 969c111d3e
4 changed files with 83 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2007-06-08 Jakub Jelinek <jakub@redhat.com>
PR c++/32177
* semantics.c (finish_omp_for): Call fold_build_cleanup_point_expr
on init, the non-decl cond operand and increment value.
2007-06-07 Simon Martin <simartin@users.sourceforge.net>
PR c++/30759

View file

@ -3806,6 +3806,8 @@ tree
finish_omp_for (location_t locus, tree decl, tree init, tree cond,
tree incr, tree body, tree pre_body)
{
tree omp_for;
if (decl == NULL)
{
if (init != NULL)
@ -3883,8 +3885,31 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
add_stmt (pre_body);
pre_body = NULL;
}
init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
init = build_modify_expr (decl, NOP_EXPR, init);
return c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body);
if (cond && TREE_SIDE_EFFECTS (cond) && COMPARISON_CLASS_P (cond))
{
int n = TREE_SIDE_EFFECTS (TREE_OPERAND (cond, 1)) != 0;
tree t = TREE_OPERAND (cond, n);
TREE_OPERAND (cond, n)
= fold_build_cleanup_point_expr (TREE_TYPE (t), t);
}
omp_for = c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body);
if (omp_for != NULL
&& TREE_CODE (OMP_FOR_INCR (omp_for)) == MODIFY_EXPR
&& TREE_SIDE_EFFECTS (TREE_OPERAND (OMP_FOR_INCR (omp_for), 1))
&& BINARY_CLASS_P (TREE_OPERAND (OMP_FOR_INCR (omp_for), 1)))
{
tree t = TREE_OPERAND (OMP_FOR_INCR (omp_for), 1);
int n = TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)) != 0;
TREE_OPERAND (t, n)
= fold_build_cleanup_point_expr (TREE_TYPE (TREE_OPERAND (t, n)),
TREE_OPERAND (t, n));
}
return omp_for;
}
void

View file

@ -1,3 +1,8 @@
2007-06-08 Jakub Jelinek <jakub@redhat.com>
PR c++/32177
* g++.dg/gomp/pr32177.C: New test.
2007-06-07 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR testsuite/25241

View file

@ -0,0 +1,46 @@
// PR c++/32177
// { dg-do compile }
// { dg-options "-fopenmp" }
//
// Copyright (C) 2007 Free Software Foundation, Inc.
// Contributed by Theodore.Papadopoulo 1 Jun 2007 <Theodore.Papadopoulo@sophia.inria.fr>
struct A
{
A () {}
~A () {}
int s () const { return 1; }
};
void
f1 ()
{
#pragma omp parallel for
for (int i = 1; i <= A ().s (); ++i)
;
}
void
f2 ()
{
#pragma omp parallel for
for (int i = A ().s (); i <= 20; ++i)
;
}
void
f3 ()
{
#pragma omp parallel for
for (int i = 1; i <= 20; i += A ().s ())
;
}
void
f4 ()
{
int i;
#pragma omp parallel for
for (i = A ().s (); i <= 20; i++)
;
}