diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d261f7872d..3b94d646829 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-18 Jakub Jelinek + + PR c++/71100 + * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Don't drop + lhs if it has TREE_ADDRESSABLE type. + 2016-05-18 Uros Bizjak PR target/71145 diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 6fcdbddb7fc..cf9192f2a1b 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1515,7 +1515,8 @@ cgraph_edge::redirect_call_stmt_to_callee (void) /* If the call becomes noreturn, remove the LHS if possible. */ if (lhs && (gimple_call_flags (new_stmt) & ECF_NORETURN) - && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST) + && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST + && !TREE_ADDRESSABLE (TREE_TYPE (lhs))) { if (TREE_CODE (lhs) == SSA_NAME) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66f5cba3c8e..6a684fc52d4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-18 Jakub Jelinek + + PR c++/71100 + * g++.dg/opt/pr71100.C: New test. + 2016-05-18 Martin Jambor PR ipa/69708 diff --git a/gcc/testsuite/g++.dg/opt/pr71100.C b/gcc/testsuite/g++.dg/opt/pr71100.C new file mode 100644 index 00000000000..ff739e2e62a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr71100.C @@ -0,0 +1,18 @@ +// PR c++/71100 +// { dg-do compile } +// { dg-options "-O2" } + +struct D { ~D (); }; +struct E { D foo () { throw 1; } }; + +inline void +bar (D (E::*f) (), E *o) +{ + (o->*f) (); +} + +void +baz (E *o) +{ + bar (&E::foo, o); +}