On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour 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.