https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90313

--- Comment #4 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
Author: rsandifo
Date: Fri Aug  9 09:37:55 2019
New Revision: 274234

URL: https://gcc.gnu.org/viewcvs?rev=274234&root=gcc&view=rev
Log:
Reject tail calls that read from an escaped RESULT_DECL (PR90313)

In this PR we have two return paths from a function "map".  The common
code sets <result> to the value returned by one path, while the other
path does:

   <retval> = map (&<retval>, ...);

We treated this call as tail recursion, losing the copy semantics
on the value returned by the recursive call.

We'd correctly reject the same thing for variables:

   local = map (&local, ...);

The problem is that RESULT_DECLs didn't get the same treatment.

2019-08-09  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        PR middle-end/90313
        * tree-tailcall.c (find_tail_calls): Reject calls that might
        read from an escaped RESULT_DECL.

gcc/testsuite/
        PR middle-end/90313
        * g++.dg/torture/pr90313.cc: New test.

Added:
    trunk/gcc/testsuite/g++.dg/torture/pr90313.cc
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-tailcall.c

Reply via email to