re PR c++/68184 (Exception from a virtual function does not get caught)

PR ipa/68184
	* g++.dg/torture/pr68184.C: New testcase.
	* cgraphunit.c (cgraph_node::analyze): Set can_throw_external.

From-SVN: r231217
This commit is contained in:
Jan Hubicka 2015-12-03 05:13:33 +01:00 committed by Jan Hubicka
parent eaa728e3a2
commit 89bbe9ba36
4 changed files with 42 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2015-12-02 Jan Hubicka <hubicka@ucw.cz>
PR ipa/68184
* cgraphunit.c (cgraph_node::analyze): Set can_throw_external.
2015-12-02 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com>

View File

@ -575,6 +575,7 @@ cgraph_node::analyze (void)
cgraph_node *t = cgraph_node::get (thunk.alias);
create_edge (t, NULL, 0, CGRAPH_FREQ_BASE);
callees->can_throw_external = !TREE_NOTHROW (t->decl);
/* Target code in expand_thunk may need the thunk's target
to be analyzed, so recurse here. */
if (!t->analyzed)

View File

@ -1,3 +1,8 @@
2015-12-02 Jan Hubicka <hubicka@ucw.cz>
PR ipa/68184
* g++.dg/torture/pr68184.C: New testcase.
2015-12-03 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/57580

View File

@ -0,0 +1,31 @@
// { dg-do run }
namespace {
struct IFoo { virtual void foo() = 0; };
struct IBar { virtual void bar() = 0; };
struct FooBar : private IBar, private IFoo
{
void call_foo()
{
try
{
static_cast<IFoo*>(this)->foo();
}
catch( ... ) {}
}
void foo() { throw 1; }
void bar() {}
};
void test()
{
FooBar foobar;
foobar.call_foo();
}
}
int main()
{
test();
return 0;
}