In what order static if conditions are evaluated?

Artur Zawłocki" <artur.zawlocki at gmail.com> Artur Zawłocki" <artur.zawlocki at gmail.com>
Thu Mar 28 06:15:32 PDT 2013


On Thursday, 28 March 2013 at 11:50:58 UTC, 1100110 wrote:
> On 03/28/2013 06:29 AM, "Artur Zawłocki" 
> <artur.zawlocki at gmail.com>" wrote:
>> Hi,
>>
>> DMD (I'm using v2.060) seems to evaluate conditions in static 
>> if's from
>> top to bottom (at least in a given scope). For example, 
>> consider the
>> following program:
>>
>> module test;
>>
>> const bool x = true;
>> const bool y = true;
>>
>> struct S {
>>
>> static assert(y);
>>
>> static if(x)
>> static const bool y = false;
>>
>> static if(y)
>> static const bool x = false;
>> }
>>
>> 'x' in the first static if condition refers to .x and the 
>> static if
>> introduces S.y to which 'y' in the second static if refers. 
>> 'y' in the
>> static assert also refers to S.y and thus the assertion fails:
>>
>> test.d(8): Error: static assert (y) is false
>>
>> Now, I guess if the second static if were evaluated first then 
>> 'y' in
>> the static assert condition would refer to .y and the program 
>> would
>> compile. Note that dmd evaluates the static assert *after* 
>> both static
>> if's.
>>
>> So clearly D program semantics depends on the order static 
>> if's and
>> static assert's are evaluated. Are there any standard rules 
>> here (I
>> cannot find anything in Language Reference) or is this 
>> behaviour
>> implementation dependent?
>>
>> Artur
>

> It should behave the "same" as a normal if statement.

Why? static if is not a statement at all, it's a 'conditional 
declaration'. And the order in which declarations are processed 
on the top level is not relevant (unless you have static if's, 
that is), e.g. you can have:

   static if (a)
     static assert (true);

   const bool a = true;

I've just discovered that this is also OK:

   static if (S.a)
     static assert (true);

   struct S { static if if (true) const bool a = true; }



More information about the Digitalmars-d mailing list