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

Reply via email to