static assert / static if
Lionello Lunesu
lio at lunesu.remove.com
Fri Feb 23 05:08:23 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 searched bugzilla, but I can't seem to find this exact issue. What
issues are similar to this one?
> Actually factorial!(0) should return 1, but I'm guessing you really
> don't care <g>.
Indeed :) but I got the code from Walter's NWCPP presentation. I guess
it should static-if on n==0 instead, and uint for that matter.
L.
More information about the Digitalmars-d-learn
mailing list