Hmm. Interesting approach. I tried to utilize the "trusted pure" concept .
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); } Kenji Hara 2013/4/30 monarch_dodra <monarchdo...@gmail.com> > I'm getting strange behavior trying to cast to pure. This is my > test program: > > //-------- > import std.stdio; > import core.stdc.stdlib; > > void main() > { > auto p1 = &core.stdc.stdlib.free; > auto p2 = cast(void function(void*))&core.stdc.**stdlib.free; > auto p3 = cast(void function(void*) > pure)&core.stdc.stdlib.free; > auto pp1 = core.stdc.stdlib.malloc(5); > auto pp2 = core.stdc.stdlib.malloc(5); > auto pp3 = core.stdc.stdlib.malloc(5); > writeln(p1); > p1(pp1); > writeln(p2); > p2(pp2); //This hangs > writeln(p3); //Never reaches here > p3(pp3); > } > //-------- > > Am I doing something wrong? Could somebody else test this? I'm on > win32. > > I've also been getting some object violations trying to use this > cast... >