static assert / static if

Don Clugston dac at nospam.com.au
Fri Feb 23 04:24:55 PST 2007


Lionello Lunesu wrote:
> I'm confused:
> 
> template factorial(int n)
> {
>     static assert(n>0);
>     static if (n == 1)
>         const factorial = 1;
>     else
>         const factorial =
>             n * factorial!(n-1);
> }
> 
> int main()
> {
>     return factorial!(0);
> }
> 
> The static assert doesn't trip. If I remove the recursion, it works 
> fine, but with it the compiler stops with:
> 
> ct.d(8): template instance ct.factorial!(-3078) recursive expansion
> 
> At first I thought that the template is instantiated before the assert 
> is tested, but the static if IS tested before recursion, so why isn't 
> the assert? Is it a bug?
> 
> L.

Yeah, there's something wrong with static assert. I think it does 
constant folding with the wrong context (many examples in bugzilla). It 
did work as you'd expect back around DMD 0.140, but lots of other things 
were broken. Inside a template, I've only got good use out of it by:

static if (n<=0) {
   static assert(0, "factorial must be >=0");
}

Actually factorial!(0) should return 1, but I'm guessing you really 
don't care <g>.


More information about the Digitalmars-d-learn mailing list