This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix middle-end/71308
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 27 May 2016 14:01:58 +0200
- Subject: Re: Fix middle-end/71308
- Authentication-results: sourceware.org; auth=none
- References: <20160527115234 dot GF3014 at redhat dot com>
On Fri, May 27, 2016 at 1:52 PM, Marek Polacek <polacek@redhat.com> wrote:
> A stupid mistake of mine. When I introduced the should_remove_lhs_p call,
> I removed the check for LHS here, because should_remove_lhs_p checks that.
> Well, in this case the LHS was NULL, but gimple_call_fntype (stmt) had void
> type, so we went on and crashed on the SSA_NAME check. Sorry. But at least
> we have a test exercising this path.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
Yes.
Richard.
> 2016-05-27 Marek Polacek <polacek@redhat.com>
>
> PR middle-end/71308
> * gimple-fold.c (gimple_fold_call): Check that LHS is not null.
>
> * g++.dg/torture/pr71308.C: New test.
>
> diff --git gcc/gimple-fold.c gcc/gimple-fold.c
> index d6657e9..600aa72 100644
> --- gcc/gimple-fold.c
> +++ gcc/gimple-fold.c
> @@ -3053,7 +3053,8 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
> == void_type_node))
> gimple_call_set_fntype (stmt, TREE_TYPE (fndecl));
> /* If the call becomes noreturn, remove the lhs. */
> - if (gimple_call_noreturn_p (stmt)
> + if (lhs
> + && gimple_call_noreturn_p (stmt)
> && (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (stmt)))
> || should_remove_lhs_p (lhs)))
> {
> diff --git gcc/testsuite/g++.dg/torture/pr71308.C gcc/testsuite/g++.dg/torture/pr71308.C
> index e69de29..ff5cd95 100644
> --- gcc/testsuite/g++.dg/torture/pr71308.C
> +++ gcc/testsuite/g++.dg/torture/pr71308.C
> @@ -0,0 +1,18 @@
> +// PR middle-end/71308
> +// { dg-do compile }
> +
> +class S
> +{
> + void foo ();
> + virtual void bar () = 0;
> + virtual ~S ();
> +};
> +inline void
> +S::foo ()
> +{
> + bar ();
> +};
> +S::~S ()
> +{
> + foo ();
> +}
>
> Marek