static assert / static if

Lionello Lunesu lio at lunesu.remove.com
Fri Feb 23 05:20:38 PST 2007


Don Clugston wrote:
> 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");
> }


I've tried this approach too:

template factorial(int n)
{
     static if (n <= 0)
         static assert(0);
     static if (n == 1)
         const factorial = 1;
     else
         const factorial =
             n * factorial!(n-1);
}

int main()
{
     return factorial!(0);
}

It still doesn't work, no assert failure.

L.


More information about the Digitalmars-d-learn mailing list