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