Bug 7452 – Function using enforce() cannot be inferred as @safe because of anonymous function due to lazy argument

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-02-06T13:22:00Z
Last change time
2012-02-19T16:28:57Z
Keywords
pull, rejects-valid
Assigned to
nobody
Creator
kennytm

Comments

Comment #0 by kennytm — 2012-02-06T13:22:40Z
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)); } ----------------------------------
Comment #1 by kennytm — 2012-02-07T12:10:39Z
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.
Comment #2 by kennytm — 2012-02-07T13:01:01Z
Comment #3 by github-bugzilla — 2012-02-19T15:00:39Z
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)