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

--- Comment #7 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-9 branch has been updated by Richard Sandiford
<rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:52db14c1f700e14e5b1b6c7fc702c0a08cc3781c

commit r9-8252-g52db14c1f700e14e5b1b6c7fc702c0a08cc3781c
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Fri Aug 9 09:37:55 2019 +0000

    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.

    2020-02-18  Richard Sandiford  <richard.sandif...@arm.com>

    gcc/
        Backport from mainline
        2019-08-09  Richard Sandiford  <richard.sandif...@arm.com>

        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.

Reply via email to