Anastasia added a comment.

In https://reviews.llvm.org/D43783#1212485, @yaxunl wrote:

> In https://reviews.llvm.org/D43783#1204353, @svenvh wrote:
>
> > Sorry for digging up an old commit...
> >
> > Apparently this broke block arguments, e.g. the following test case:
> >
> >   int foo(int (^ bl)(void)) {
> >     return bl();
> >   }
> >  
> >   int get21() {
> >     return foo(^{return 21;});
> >   }
> >  
> >   int get42() {
> >     return foo(^{return 42;});
> >   }
> >
> >
> > In particular, the VarDecl that `getBlockExpr()` sees doesn't have an 
> > initializer when the called block comes from an argument (causing clang to 
> > crash).
>
>
> Sorry for the delay. I think block should not be allowed as function argument 
> since this generally leads indirect function calls therefore requires support 
> of function pointer. It will rely on optimizations to get rid of indirect 
> function calls.


The idea was to allow blocks as function parameters because they are statically 
known at each function call. This can be resolved later at IR level instead of 
frontend. I am also not sure there can be other corner cases where it wouldn't 
work in Clang since we can't leverage analysis passes here. I feel this might 
be a risky thing to do in Clang. Currently it doesn't work for the examples 
provided and therefore breaking the compliance with the spec.


Repository:
  rC Clang

https://reviews.llvm.org/D43783



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

Reply via email to