[cfe-commits] [patch] Fix crash when referring from a closure to an enclosing local in a function returning void

Nico Weber thakis at chromium.org
Wed Jul 11 08:37:23 PDT 2012

On Wed, Jul 11, 2012 at 5:35 PM, Nico Weber <thakis at chromium.org> wrote:
> Hi,
> the attached patch fixes PR13314, clang crashing on code like this:
> void f() {
>   Foo foo;
>   [=]() {
>     return foo;
>   };
> }
> This crash was introduced in r152491, which replaced BlockDeclRefExpr
> with a bit on DeclRefExpr. getCopyElisionCandidate() wasn't taught
> about the new bit, so the the `return foo;` in the closure marks `foo`
> as a NRVO candidate, but codegen for f() then looks at the return type
> of f for NRVO. Since the function returns void, this results in a
> failing assert somewhere down the line (see the bug for more details).
> The attached patch makes getCopyElisionCandidate() ignore DeclRefExprs
> that return to enclosing locals, which is I believe what happened

s/return to/refer to/

> before r152491 too.
> Ok?
> Nico
> ps: A coworker tells me that this is a regression in the latest Xcode
> DP, so you might want to merge the fix to the next Xcode release
> branch.

More information about the cfe-commits mailing list