re PR c++/33890 (ICE in tsubst_copy with OpenMP)

PR c++/33890
	* semantics.c (finish_omp_for): Don't call
	fold_build_cleanup_point_expr if processing_template_decl.

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

From-SVN: r131397
This commit is contained in:
Jakub Jelinek 2008-01-08 17:06:31 +01:00 committed by Jakub Jelinek
parent 0c6ce8b027
commit b2ebd26837
4 changed files with 56 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2008-01-08 Jakub Jelinek <jakub@redhat.com>
PR c++/33890
* semantics.c (finish_omp_for): Don't call
fold_build_cleanup_point_expr if processing_template_decl.
2008-01-04 Paolo Carlini <pcarlini@suse.de>
Jakub Jelinek <jakub@redhat.com>

View File

@ -3,8 +3,8 @@
building RTL. These routines are used both during actual parsing
and during the instantiation of template functions.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008 Free Software Foundation, Inc.
Written by Mark Mitchell (mmitchell@usa.net) based on code found
formerly in parse.y and pt.c.
@ -3893,15 +3893,17 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
pre_body = NULL;
}
init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
if (!processing_template_decl)
init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
init = build_modify_expr (decl, NOP_EXPR, init);
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);
if (!processing_template_decl)
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
@ -3912,9 +3914,10 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
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));
if (!processing_template_decl)
TREE_OPERAND (t, n)
= fold_build_cleanup_point_expr (TREE_TYPE (TREE_OPERAND (t, n)),
TREE_OPERAND (t, n));
}
return omp_for;
}

View File

@ -1,3 +1,8 @@
2008-01-08 Jakub Jelinek <jakub@redhat.com>
PR c++/33890
* g++.dg/gomp/pr33890.C: New test.
2008-01-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34476

View File

@ -0,0 +1,34 @@
// PR c++/33890
// { dg-do compile }
// { dg-options "-fopenmp" }
struct A
{
int x;
A () : x (0) {}
int & getX ();
};
template <int> void
foo ()
{
A a;
#pragma omp for
for (int i = a.getX (); i < 10; ++i)
;
#pragma omp for
for (int i = 0; i < a.getX (); ++i)
;
a.x = 1;
#pragma omp for
for (int i = 0; i < 10; i += a.getX ())
;
}
void
bar ()
{
foo <0> ();
foo <1> ();
}