]> granicus.if.org Git - clang/commitdiff
Make sure the __invoke function for lambdas returns properly. Per bug report on...
authorEli Friedman <eli.friedman@gmail.com>
Thu, 13 Dec 2012 23:37:17 +0000 (23:37 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Thu, 13 Dec 2012 23:37:17 +0000 (23:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170160 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGClass.cpp
test/CodeGenCXX/lambda-expressions.cpp

index b2225e48e3610d6b56ae5658b4bad46a2456c522..9df8905bcd00769f57eb807f5766f4452b1337b8 100644 (file)
@@ -1787,6 +1787,8 @@ void CodeGenFunction::EmitForwardingCallToLambda(const CXXRecordDecl *lambda,
   // If necessary, copy the returned value into the slot.
   if (!resultType->isVoidType() && returnSlot.isNull())
     EmitReturnOfRValue(RV, resultType);
+  else
+    EmitBranchThroughCleanup(ReturnBlock);
 }
 
 void CodeGenFunction::EmitLambdaBlockInvokeBody() {
index 19195c9dd2924b76095b686290a6e46850a29e30..e4bdf9202ada49fb91602a4fe487e948e7a7f280 100644 (file)
@@ -80,6 +80,15 @@ int g() {
   return [] { return r; } ();
 };
 
+// CHECK: define internal void @"_ZZ1hvEN3$_78__invokeEv"(%struct.A* noalias sret %agg.result)
+// CHECK-NEXT: entry:
+// CHECK-NEXT: call void @"_ZZ1hvENK3$_7clEv"(%struct.A* sret %agg.result,
+// CHECK-NEXT: ret void
+struct A { ~A(); };
+void h() {
+  A (*h)() = [] { return A(); };
+}
+
 // CHECK: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
 // CHECK: store i32
 // CHECK-NEXT: store i32