From 960db8ec97c6b2d8381040f71b5852d1854197da Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 18 May 2016 23:23:07 +0200 Subject: [PATCH] re PR c++/71100 (Internal compiler error while calling a pointer to member function that throws) PR c++/71100 * cgraph.c (cgraph_edge::redirect_call_stmt_to_callee): Don't drop lhs if it has TREE_ADDRESSABLE type. * g++.dg/opt/pr71100.C: New test. From-SVN: r236430 --- gcc/ChangeLog | 6 ++++++ gcc/cgraph.c | 3 ++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr71100.C | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr71100.C 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); +} -- 2.30.2