www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Worlds of CTFEs & templates

Currently this program doesn't compile:


template Foo(int x) {
    static if (x)
        enum int Foo = 1;
    else
        enum int Foo = 0;
}
int bar() {
    if (__ctfe) {
        for (int i; i < 1; i++)
            int r = Foo!(i);
    }
    return 0;
}
enum int r = bar();
void main() {}


I think it doesn't compile because CTFE functions must be able to run both at
compile-time and run-time, so it can't call a template that uses a "run-time"
variable, even if it's used only by a CTFE function that knows the value at
compile-time :-)

I think that if(__ctfe){ doesn't improve the situation because that's another
run-time variable.

But being able to use templates from CTFE functions is very useful, otherwise
the worlds of CTFE and templates are too much separated (but I think a template
can call a CTFE function), and the compiler knows that the code inside the
if(__ctfe){ will never run at run-time.

So can the compiler be modified to allow templates inside the scope of
if(__ctfe){...} ?

Bye,
bearophile
Mar 13 2010