Thread overview
isCallableCTFE trait to test whether an expression is callable during CTFE
Jul 11, 2013
Timothee Cour
Jul 11, 2013
timotheecour
Jul 11, 2013
Kenji Hara
Jul 11, 2013
timotheecour
July 11, 2013
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)));
}


July 11, 2013
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.
July 11, 2013
On Thursday, 11 July 2013 at 03:10:38 UTC, timotheecour wrote:
> On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour wrote:
[snip]
>
> can we add this to std.traits?
> it allows (among other things) to write unittests for CTFE, etc.

Phobos has an internal helper function for testing CTFEable.
https://github.com/D-Programming-Language/phobos/blob/master/std/exception.d#L1322

Kenji Hara
July 11, 2013
On Thursday, 11 July 2013 at 03:29:13 UTC, Kenji Hara wrote:
> On Thursday, 11 July 2013 at 03:10:38 UTC, timotheecour wrote:
>> On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour wrote:
> [snip]
>>
>> can we add this to std.traits?
>> it allows (among other things) to write unittests for CTFE, etc.
>
> Phobos has an internal helper function for testing CTFEable.
> https://github.com/D-Programming-Language/phobos/blob/master/std/exception.d#L1322
>
> Kenji Hara


Mine is more flexible. The one you mention can only work in a static assert statement.
We could replace it in terms of static assert(isCallableCTFE!dg) but not vice versa.