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 bug
return [1].array;
}
int fun2(int x){
return 1;
}
auto fun2_N(int x){
import std.array;
//same as fun1_N
return [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)));
}


can we add this to std.traits?
it allows (among other things) to write unittests for CTFE, etc.