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:
parent
1579e8d235
commit
969c111d3e
4 changed files with 83 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
46
gcc/testsuite/g++.dg/gomp/pr32177.C
Normal file
46
gcc/testsuite/g++.dg/gomp/pr32177.C
Normal 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++)
|
||||
;
|
||||
}
|
Loading…
Add table
Reference in a new issue