tree-eh.c (optimize_double_finally): Don't assume that the cleanup we're duplicating is only one statement.
* tree-eh.c (optimize_double_finally): Don't assume that the cleanup we're duplicating is only one statement. From-SVN: r129311
This commit is contained in:
parent
5012f3e3c7
commit
2a19b1a9c7
@ -1,3 +1,8 @@
|
||||
2007-10-14 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* tree-eh.c (optimize_double_finally): Don't assume that the
|
||||
cleanup we're duplicating is only one statement.
|
||||
|
||||
2007-10-14 Kazu Hirata <kazu@codesourcery.com>
|
||||
|
||||
* config/fixed-bit.c, config/i386/cpuid.h, config/i386/i386.c,
|
||||
|
44
gcc/testsuite/g++.dg/eh/ehopt1.C
Normal file
44
gcc/testsuite/g++.dg/eh/ehopt1.C
Normal file
@ -0,0 +1,44 @@
|
||||
// ehopt was only copying one statement from the cleanup of the B temporary
|
||||
// into the following try block, so we lost its destructor call.
|
||||
|
||||
// { dg-do run }
|
||||
|
||||
template <class T, class U>
|
||||
class A;
|
||||
|
||||
bool b;
|
||||
int count;
|
||||
|
||||
template <>
|
||||
class A<int, int>
|
||||
{
|
||||
public:
|
||||
A(int) { ++count; if (b) throw 1; }
|
||||
A(const A&) { ++count; if (b) throw 1; }
|
||||
~A() { --count; if (b) throw 1; }
|
||||
};
|
||||
|
||||
typedef A<int, int> B;
|
||||
|
||||
template <>
|
||||
class A<void *, void *>
|
||||
{
|
||||
public:
|
||||
A() { if (b) throw 1; }
|
||||
A(const B&) { if (b) throw 1; }
|
||||
~A() { if (b) throw 1; }
|
||||
};
|
||||
|
||||
typedef A<void *, void *> C;
|
||||
|
||||
void f() { if (b) throw 1; }
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
{
|
||||
C a(1);
|
||||
f();
|
||||
}
|
||||
return count;
|
||||
}
|
@ -2157,18 +2157,12 @@ optimize_double_finally (tree one, tree two)
|
||||
|
||||
if (same_handler_p (TREE_OPERAND (oneh, 1), TREE_OPERAND (two, 1)))
|
||||
{
|
||||
tree twoh;
|
||||
|
||||
tree b = TREE_OPERAND (oneh, 0);
|
||||
TREE_OPERAND (one, 1) = b;
|
||||
TREE_SET_CODE (one, TRY_CATCH_EXPR);
|
||||
|
||||
b = tsi_stmt (tsi_start (b));
|
||||
twoh = TREE_OPERAND (two, 0);
|
||||
/* same_handler_p only handles single-statement handlers,
|
||||
so there must only be one statement. */
|
||||
i = tsi_start (twoh);
|
||||
tsi_link_before (&i, unshare_expr (b), TSI_SAME_STMT);
|
||||
i = tsi_start (TREE_OPERAND (two, 0));
|
||||
tsi_link_before (&i, unsave_expr_now (b), TSI_SAME_STMT);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user