From: Nico Weber Date: Wed, 11 Jul 2012 22:50:15 +0000 (+0000) Subject: Don't try to do RVO on block variables that refer to an enclosing local. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8951067a2bc35fb2a535bc18432cb2d02a762b73;p=clang Don't try to do RVO on block variables that refer to an enclosing local. Fixes PR13314, clang crashing on blocks refering to an enclosing local when the enclosing function returns void. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160089 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 9be1d34dae..54ec58af41 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -2035,7 +2035,7 @@ const VarDecl *Sema::getCopyElisionCandidate(QualType ReturnType, // ... the expression is the name of a non-volatile automatic object // (other than a function or catch-clause parameter)) ... const DeclRefExpr *DR = dyn_cast(E->IgnoreParens()); - if (!DR) + if (!DR || DR->refersToEnclosingLocal()) return 0; const VarDecl *VD = dyn_cast(DR->getDecl()); if (!VD) diff --git a/test/CodeGenObjCXX/blocks.mm b/test/CodeGenObjCXX/blocks.mm index 72af74f1eb..62ae428e5e 100644 --- a/test/CodeGenObjCXX/blocks.mm +++ b/test/CodeGenObjCXX/blocks.mm @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -x objective-c++ -fblocks -triple x86_64-apple-darwin -fobjc-runtime=macosx-fragile-10.5 %s -verify -emit-llvm -o %t +// RUN: %clang_cc1 -x objective-c++ -fblocks -triple x86_64-apple-darwin -fobjc-runtime=macosx-fragile-10.5 %s -verify -std=c++11 -emit-llvm -o %t // rdar://8979379 @interface A @@ -30,7 +30,7 @@ void foo(id (^objectCreationBlock)(void)) { // Test4 struct S { - S *(^a)() = ^{ // expected-warning {{C++11}} + S *(^a)() = ^{ return this; }; }; @@ -40,7 +40,22 @@ S s; struct X { void f() { ^ { - struct Nested { Nested *ptr = this; }; // expected-warning {{C++11}} + struct Nested { Nested *ptr = this; }; } (); }; }; + +// Regression test for PR13314 +class FooClass { }; +void fun() { + FooClass foovar; + ^() { // expected-warning {{expression result unused}} + return foovar; + }; +} +void gun() { + FooClass foovar; + [=]() { // expected-warning {{expression result unused}} + return foovar; + }; +}