]> granicus.if.org Git - clang/commitdiff
Don't try to do RVO on block variables that refer to an enclosing local.
authorNico Weber <nicolasweber@gmx.de>
Wed, 11 Jul 2012 22:50:15 +0000 (22:50 +0000)
committerNico Weber <nicolasweber@gmx.de>
Wed, 11 Jul 2012 22:50:15 +0000 (22:50 +0000)
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

lib/Sema/SemaStmt.cpp
test/CodeGenObjCXX/blocks.mm

index 9be1d34dae7aac0a1a44c7e098303ef93124ce76..54ec58af419d64cc86d23aa85295649c837fe5f6 100644 (file)
@@ -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)
index 72af74f1ebf76aef35b02a60ab03e684d4530397..62ae428e5ec169e8f970f39784f310e30beda57d 100644 (file)
@@ -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;
+  };
+}