import std; struct W(T) { T value; auto hook(handlers...)() { return handlers[0](value); } } template f(handlers...) { auto ref f(T)(auto ref T value) { return value.hook!handlers; } } @nogc void main() { auto a = W!int(3); auto b = a.f!((_) => "yes"); } Produces: Error: @nogc function D main cannot call non-@nogc function onlineapp.main.f!(W!int).f Adding @nogc on function f says hook!((_) => "yes").hook closes over variable __this310 If you explicitly specify a type on the lambda that you pass to f then it compiles: auto b = a.f!((int) => "yes");
f's instantiation with untyped lambda: f!(W!int) { auto pure nothrow @safe string f(ref W!int value) { return (void*[2] __this3 = null;) , value.hook(); } } With typed lambda: f!(W!int) { auto pure nothrow @nogc @safe string f(ref W!int value) { return value.hook(); } }
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19603 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB