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.