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:
parent
29173496a0
commit
e0eb05eaa1
4 changed files with 56 additions and 0 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
41
gcc/testsuite/g++.dg/gomp/pr30558.C
Normal file
41
gcc/testsuite/g++.dg/gomp/pr30558.C
Normal 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)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue