From: Fariborz Jahanian Date: Tue, 5 Oct 2010 18:05:06 +0000 (+0000) Subject: Fix a block rewriter bug where copy/dispose entries in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=92c8568856bf24360f0a90a2161b9962263d4994;p=clang Fix a block rewriter bug where copy/dispose entries in 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 --- diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj index def722b45e..2a25645088 100644 --- a/clang.xcodeproj/project.pbxproj +++ b/clang.xcodeproj/project.pbxproj @@ -2039,7 +2039,6 @@ isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */; compatibilityVersion = "Xcode 2.4"; - developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, diff --git a/lib/Rewrite/RewriteObjC.cpp b/lib/Rewrite/RewriteObjC.cpp index c085e6d017..abd46df831 100644 --- a/lib/Rewrite/RewriteObjC.cpp +++ b/lib/Rewrite/RewriteObjC.cpp @@ -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 index 0000000000..5a8e1ccdcf --- /dev/null +++ b/test/Rewriter/rewrite-nested-blocks-2.mm @@ -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); + }); + }); +}