]> granicus.if.org Git - clang/commitdiff
Fix a block rewriter bug where copy/dispose entries in
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 5 Oct 2010 18:05:06 +0000 (18:05 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 5 Oct 2010 18:05:06 +0000 (18:05 +0000)
block descriptor for outer block was missing even though
the block was importing objects into its inner blocks.
//rdar://84995992

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115644 91177308-0d34-0410-b5e6-96231b3b80d8

clang.xcodeproj/project.pbxproj
lib/Rewrite/RewriteObjC.cpp
test/Rewriter/rewrite-nested-blocks-2.mm [new file with mode: 0644]

index def722b45e463c55b4f4ac94bb02bbf68520f5b7..2a256450887b2e8161fdfa1d9101a31e9aac1d7a 100644 (file)
                        isa = PBXProject;
                        buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */;
                        compatibilityVersion = "Xcode 2.4";
-                       developmentRegion = English;
                        hasScannedForEncodings = 1;
                        knownRegions = (
                                English,
index c085e6d017586e5ad8f629ba1282c45dc32f6ad4..abd46df831cdeada1053160c8cda23371bfdcca3 100644 (file)
@@ -4381,6 +4381,12 @@ void RewriteObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart,
         BlockByRefDeclsPtrSet.insert(VD);
         BlockByRefDecls.push_back(VD);
       }
+      // imported objects in the inner blocks not used in the outer
+      // blocks must be copied/disposed in the outer block as well.
+      if (Exp->isByRef() ||
+          VD->getType()->isObjCObjectPointerType() || 
+          VD->getType()->isBlockPointerType())
+        ImportedBlockDecls.insert(VD);
     }
 
     std::string ImplTag = "__" + FunName.str() + "_block_impl_" + utostr(i);
diff --git a/test/Rewriter/rewrite-nested-blocks-2.mm b/test/Rewriter/rewrite-nested-blocks-2.mm
new file mode 100644 (file)
index 0000000..5a8e1cc
--- /dev/null
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
+// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
+// grep "static void __FUNC_block_copy_" %t-rw.cpp | count 2
+// rdar://8499592
+
+void Outer(void (^bk)());
+void Inner(void (^bk)());
+void INNER_FUNC(id d);
+
+void FUNC() {
+    
+    id bar = (id)42;
+    Outer(^{
+        Inner(^{
+            INNER_FUNC(bar);
+        });
+    });    
+}