ahatanak added a comment. In D58514#1428495 <https://reviews.llvm.org/D58514#1428495>, @dexonsmith wrote:
> In D58514#1428434 <https://reviews.llvm.org/D58514#1428434>, @ahatanak wrote: > > > Seems like the chromium code is valid and shouldn't crash. John/Erik what > > do you think? The following code also crashes with this patch applied. > > > > typedef void (^BlockTy)(); > > > > BlockTy sb; > > __weak BlockTy wb; > > > > void foo(id a) { > > auto b = ^{ NSLog(@"foo %@", a); }; > > wb = b; // block isn't copied to the heap. > > sb = b; // block is copied to the heap. > > } > > > > int main() { > > auto x = [NSObject new]; > > foo(x); > > sb(); > > wb(); > > return 0; > > } > > > > > The assignment to `wb` seems like an escape of some sort. What happens for > this similar code? > > typedef void (^BlockTy)(); > > BlockTy sb; > __weak BlockTy wb; > > void bar(id b) { > wb = b; > sb = b; > } > > void foo(id a) { > bar(^{ NSLog(@"foo %@", a); }); > } > > int main() { > auto x = [NSObject new]; > foo(x); > sb(); > wb(); > return 0; > } > That code doesn't crash because the block is retained at the entry of `bar` and ARC optimizer doesn't remove the retain/release pairs in `bar`. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D58514/new/ https://reviews.llvm.org/D58514 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits