diff options
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 2 | ||||
-rw-r--r-- | test/CodeGenObjCXX/blocks.mm | 21 |
2 files changed, 19 insertions, 4 deletions
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<DeclRefExpr>(E->IgnoreParens()); - if (!DR) + if (!DR || DR->refersToEnclosingLocal()) return 0; const VarDecl *VD = dyn_cast<VarDecl>(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 <NSObject>(^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; + }; +} |