re PR tree-optimization/30558 (ICE with OpenMP and exceptions)

PR tree-optimization/30558
	* tree-eh.c (lower_eh_filter): If EH_FILTER_MUST_NOT_THROW
	clear this_state.prev_try.

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

From-SVN: r124177
This commit is contained in:
Jakub Jelinek 2007-04-26 09:29:46 +02:00 committed by Jakub Jelinek
parent 29173496a0
commit e0eb05eaa1
4 changed files with 56 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2007-04-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/30558
* tree-eh.c (lower_eh_filter): If EH_FILTER_MUST_NOT_THROW
clear this_state.prev_try.
2007-04-26 Richard Sandiford <richard@codesourcery.com>
Mark Mitchell <mark@codesourcery.com>

View File

@ -1,3 +1,8 @@
2007-04-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/30558
* g++.dg/gomp/pr30558.C: New test.
2007-04-24 Mark Mitchell <mark@codesourcery.com>
PR c++/31338

View File

@ -0,0 +1,41 @@
// PR tree-optimization/30558
// { dg-do compile }
// { dg-options "-fopenmp" }
template <typename T> struct F
{
~F ();
F (T);
const T &operator[] (unsigned i) const;
};
template <typename T> F<T> foo (const F<T> &x)
{
return F<T> (x[1]);
}
struct G
{
G () { bar (2); }
F<int> &operator () (F<int> x);
void bar (int);
};
int
main ()
{
try
{
G g;
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
{
F<int> j (i);
F<int> f = g (j);
F<int> h = foo (f);
}
}
catch (int &e)
{
}
}

View File

@ -1497,6 +1497,10 @@ lower_eh_filter (struct leh_state *state, tree *tp)
EH_FILTER_TYPES (inner));
this_state = *state;
this_state.cur_region = this_region;
/* For must not throw regions any cleanup regions inside it
can't reach outer catch regions. */
if (EH_FILTER_MUST_NOT_THROW (inner))
this_state.prev_try = NULL;
lower_eh_constructs_1 (&this_state, &TREE_OPERAND (*tp, 0));