template TrustedPure(alias func)
{
import std.traits, std.algorithm;
alias F1 = FunctionTypeOf!(func);
static if (functionAttributes!F1 & FunctionAttribute.pure_)
{
alias TrustedPure = func;
}
else
{
alias F2 = SetFunctionAttributes!(
F1,
functionLinkage!F1,
functionAttributes!F1 | FunctionAttribute.pure_);
auto ref TrustedPure(A...)(auto ref A args)
pure // mark as expected
@system // represent 'unsafe' operation.
{
// forward!args does not work, because
// std.algorithm.move is not pure...
return (cast(F2*)&func)(/*forward!*/args);
}
}
}
void main() pure
// cannot add @safe, because TrustedPure functions are always @system
{
import core.stdc.stdlib;
alias pmalloc = TrustedPure!(core.stdc.stdlib.malloc);
alias pfree = TrustedPure!(core.stdc.stdlib.free);
auto p = cast(int*)pmalloc(int.sizeof);
*p = 100;
pfree(p);
}