Test case: ---------------------------------- import std.exception; int f7452()(int x) { enforce(x > 0); return x; } void g7452() @safe pure { assert(4 == f7452(4)); } ---------------------------------- This caused error: Error: safe function 'g7452' cannot call system function 'f7452' This is because of the lazy argument, as shown with this minimal D-only test case: ---------------------------------- void e7452b(int, lazy int) pure nothrow @safe {} int f7452b()(int x) { e7452b(x, 0); return x; } void g7452b() pure nothrow @safe { assert(4 == f7452b(4)); } ----------------------------------
Further reduced test case, showing the cause is the function/delegate type, not 'lazy'. ----------------- int f7452c()(int x) { auto y = function int() { return 0; }; return x; } void g7452c() pure nothrow @safe { assert(4 == f7452c(4)); } ----------------- Note that 'pure' and 'nothrow' are correctly inferred.
https://github.com/D-Programming-Language/dmd/pull/700
Commit pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/b9938baed4f3a0d3606d40ad435ca0e18176980e Merge pull request #700 from kennytm/bug7452_lazy_safe Bug 7452 (@safe inference failed with a function literal inside)