Faking a non-pure function as pure

Nordlöw per.nordlow at gmail.com
Fri Feb 16 17:58:18 UTC 2018


I'm struggling with my definition of assumePure that should make 
a non-pure function `f` callable as pure `pureF`.

I've copied the definition of assumePure from the Phobos docs at

https://dlang.org/phobos/std_traits.html#SetFunctionAttributes

and managed to define pureF using it but I cannot call `pureF` as 
either

     auto x = (*pureF)(42);
     auto x = pureF(42);

How do I do that?

import std.traits : isFunctionPointer, isDelegate, 
functionAttributes, FunctionAttribute, SetFunctionAttributes, 
functionLinkage;

/** Return `T` assumed to be `pure`.
     Copied from 
https://dlang.org/phobos/std_traits.html#SetFunctionAttributes.
     */
auto assumePure(T)(T t)
     if (isFunctionPointer!T || isDelegate!T)
{
     enum attrs = functionAttributes!T | FunctionAttribute.pure_;
     return cast(SetFunctionAttributes!(T, functionLinkage!T, 
attrs)) t;
}

int f(int x)
{
     return x + 1;
}

void g() pure
{
     static assert(!__traits(compiles, { auto x = f(42); }));
     alias pureF = assumePure!(typeof(&f));
     // TODO: how do I call pureF?
     // auto x = (*pureF)(42);
     // auto x = pureF(42);
}



More information about the Digitalmars-d-learn mailing list