On Wed, Jul 10, 2013 at 7:16 PM, Timothee Cour <thelastmammoth@gmail.com> wrote:
template isCallableCTFE(alias fun){template isCallableCTFE_aux(alias T){enum isCallableCTFE_aux=T;}enum isCallableCTFE=__traits(compiles,isCallableCTFE_aux!(fun()));}template isCallableCTFE2(fun...){enum isCallableCTFE2=true;}unittest{int fun1(){return 1;}auto fun1_N(){import std.array;//would return Error: gc_malloc cannot be interpreted at compile time, because it has no available source code due to a bugreturn [1].array;}int fun2(int x){return 1;}auto fun2_N(int x){import std.array;//same as fun1_Nreturn [1].array;}int a1;enum a2=0;static assert(!isCallableCTFE!(()=>a1));static assert(isCallableCTFE!(()=>a2));static assert(isCallableCTFE!fun1);static assert(!isCallableCTFE!fun1_N);static assert(isCallableCTFE!(()=>fun2(0)));static assert(!isCallableCTFE!(()=>fun2_N(0)));//NOTE:an alternate syntax which could be implemented would be: static assert(!isCallableCTFE!(fun2_N,0)));}