Commit 969c111d by Jakub Jelinek Committed by Jakub Jelinek

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
parent 1579e8d2
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> 2007-06-07 Simon Martin <simartin@users.sourceforge.net>
PR c++/30759 PR c++/30759
......
...@@ -3806,6 +3806,8 @@ tree ...@@ -3806,6 +3806,8 @@ tree
finish_omp_for (location_t locus, tree decl, tree init, tree cond, finish_omp_for (location_t locus, tree decl, tree init, tree cond,
tree incr, tree body, tree pre_body) tree incr, tree body, tree pre_body)
{ {
tree omp_for;
if (decl == NULL) if (decl == NULL)
{ {
if (init != NULL) if (init != NULL)
...@@ -3883,8 +3885,31 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond, ...@@ -3883,8 +3885,31 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
add_stmt (pre_body); add_stmt (pre_body);
pre_body = NULL; pre_body = NULL;
} }
init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
init = build_modify_expr (decl, NOP_EXPR, 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 void
......
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> 2007-06-07 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR testsuite/25241 PR testsuite/25241
// 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++)
;
}
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