templated lambda with {} cause GC

rikki cattermole rikki at cattermole.co.nz
Fri Aug 10 10:02:39 UTC 2018


On 10/08/2018 9:57 PM, learnfirst1 wrote:
> 
> import core.stdc.stdio;
> 
> struct Test {
>      string name ;
> }
> 
> void T(alias pred, A...)(){
>      __gshared t = Test(A) ;
>       pred(t);
> }
> 
> extern(C) void main(){
>      T!(t => printf("test 1 name = %s\n".ptr, t.name.ptr), "test") ; // 
> build OK
>      T!(t => {
>          printf("test 2 name = %s\n".ptr, t.name.ptr);
>      }, "test") ; // build error
> }
> 
> --------------
> 
> build this with betterC
> 
> Undefined symbols for architecture x86_64:
>    "__d_allocmemory", referenced from:
>        __D4test4mainUZ__T9__lambda2TSQBb4TestZQvFNaNbNfQtZDFNbNiZv in 
> test.o
> ld: symbol(s) not found for architecture x86_64
> clang: error: linker command failed with exit code 1 (use -v to see 
> invocation)
> Error: linker exited with status 1
> 
> 
> to use without {}, it work as expect.
> 
> Is there a way to avoid this GC with {}, because we need multi line here.

Without the brackets it is inferring to not have state and hence is a 
function. But with the brackets it is assuming there is state required 
and hence has to allocate. Without manually allocating said state (not 
what you want), you cannot do this.


More information about the Digitalmars-d-learn mailing list