ahatanak added inline comments.

================
Comment at: include/clang/Basic/AttrDocs.td:118
+  let Content = [{
+``noescape`` placed on a block parameter is used to inform the compiler that 
the block passed to a function cannot escape: that is, the block will not be 
invoked after the function returns. To ensure that the block does not escape, 
clang imposes the following restrictions on usage of non-escaping blocks:
+
----------------
aaron.ballman wrote:
> Please wrap to 80 columns.
> 
> "block parameter" is a bit strange -- I assumed that meant parameter to a 
> block, not a function parameter of block type. May want to clarify.
> 
> Should also clarify "the block will not be invoked after the function 
> returns." Does this code produce undefined behavior?
> ```
>   typedef void (^BlockTy)();
>   void nonescapingFunc(__attribute__((noescape)) BlockTy);
>   void escapingFunc(BlockTy);
> 
>   void callerFunc(__attribute__((noescape)) BlockTy block) {
>     nonescapingFunc(block); // OK
>     escapingFunc(block);    // error: parameter is not annotated with noescape
>   }
> 
>   void f(void) {
>     BlockTy Blk = ^{};
>     callerFunc(Blk);
>     Blk();
>   }
> ```
The code above doesn't produce undefined behavior as long as escapingFunc 
doesn't cause the block to escape. It is OK to declare a variable to hold the 
block and invoke it later after callerFunc returns. If a block literal is 
directly passed to callerFunc, the block will not be invoked after the function 
returns.

```
void f(void) {
  BlockTy Blk = ^{};
  callerFunc(Blk); // Blk can be invoked after callerFunc returns.
  Blk();
  callerFunc(^{}); // the block passed cannot be invoked after callerFunc 
returns.
}```


https://reviews.llvm.org/D32210



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to