www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - alias and __VERSION__ condition doesn't play well

reply frame <frame86 live.com> writes:
At the very top of my module I have this declaration:

```d
static if (__VERSION__ >= 2098)
{
     alias Foo = TypeA;
}
else
{
     alias Foo = TypeB;
}
```

No problem inside the module itself but this doesn't work when 
imported from another module:
Error: undefined identifier `Foo`

While this workaround works:

```d
template getAlias()
{
     static if (__VERSION__ >= 2098)
     {
         alias getAlias = TypeA;
     }
     else
     {
         alias getAlias = TypeB;
     }
}
alias Foo = getAlias!();
```

Is there a reason for that?
Jan 17 2022
next sibling parent vit <vit vit.vit> writes:
On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:
 At the very top of my module I have this declaration:

 ```d
 static if (__VERSION__ >= 2098)
 {
     alias Foo = TypeA;
 }
 else
 {
     alias Foo = TypeB;
 }
 ```

 No problem inside the module itself but this doesn't work when 
 imported from another module:
 Error: undefined identifier `Foo`

 While this workaround works:

 ```d
 template getAlias()
 {
     static if (__VERSION__ >= 2098)
     {
         alias getAlias = TypeA;
     }
     else
     {
         alias getAlias = TypeB;
     }
 }
 alias Foo = getAlias!();
 ```

 Is there a reason for that?
static ifs and mixins need semantic analysis to expand, but when you import module, the semantic analysis doesn't run yet (depends on order). Beter workaround is: ```d import std.traits : Select; alias Foo = Select!(__VERSION__ >= 2098, TypeA, TypeB); ```
Jan 17 2022
prev sibling parent reply Paul Backus <snarwin gmail.com> writes:
On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:
 At the very top of my module I have this declaration:

 ```d
 static if (__VERSION__ >= 2098)
 {
     alias Foo = TypeA;
 }
 else
 {
     alias Foo = TypeB;
 }
 ```

 No problem inside the module itself but this doesn't work when 
 imported from another module:
 Error: undefined identifier `Foo`
Works for me: https://run.dlang.io/is/XZlvQ8
Jan 18 2022
parent reply vit <vit vit.vit> writes:
On Tuesday, 18 January 2022 at 12:05:38 UTC, Paul Backus wrote:
 On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:
 At the very top of my module I have this declaration:

 ```d
 static if (__VERSION__ >= 2098)
 {
     alias Foo = TypeA;
 }
 else
 {
     alias Foo = TypeB;
 }
 ```

 No problem inside the module itself but this doesn't work when 
 imported from another module:
 Error: undefined identifier `Foo`
Works for me: https://run.dlang.io/is/XZlvQ8
It works until you have cyclic dependencies: https://run.dlang.io/is/wDDcK5
Jan 18 2022
parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
On 1/18/22 7:19 AM, vit wrote:
 On Tuesday, 18 January 2022 at 12:05:38 UTC, Paul Backus wrote:
 On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:
 At the very top of my module I have this declaration:

 ```d
 static if (__VERSION__ >= 2098)
 {
     alias Foo = TypeA;
 }
 else
 {
     alias Foo = TypeB;
 }
 ```

 No problem inside the module itself but this doesn't work when 
 imported from another module:
 Error: undefined identifier `Foo`
Works for me: https://run.dlang.io/is/XZlvQ8
It works until you have cyclic dependencies: https://run.dlang.io/is/wDDcK5
Has nothing to do with `__VERSION__`: https://run.dlang.io/is/pa8lDy That does seem like a bug. And it's LDC specific, dmd seems to work fine. -Steve
Jan 18 2022
parent vit <vit vit.vit> writes:
On Wednesday, 19 January 2022 at 04:15:54 UTC, Steven 
Schveighoffer wrote:
 On 1/18/22 7:19 AM, vit wrote:
 On Tuesday, 18 January 2022 at 12:05:38 UTC, Paul Backus wrote:
 On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:
 At the very top of my module I have this declaration:

 ```d
 static if (__VERSION__ >= 2098)
 {
     alias Foo = TypeA;
 }
 else
 {
     alias Foo = TypeB;
 }
 ```

 No problem inside the module itself but this doesn't work 
 when imported from another module:
 Error: undefined identifier `Foo`
Works for me: https://run.dlang.io/is/XZlvQ8
It works until you have cyclic dependencies: https://run.dlang.io/is/wDDcK5
Has nothing to do with `__VERSION__`: https://run.dlang.io/is/pa8lDy That does seem like a bug. And it's LDC specific, dmd seems to work fine. -Steve
In dmd is order of module compilation different. Same problem: https://run.dlang.io/is/NkySAw This is not only problem with imports: ```d class Foo{ Bar.B b; static if(true) alias F = int; } class Bar{ Foo.F f; //Error: no property `F` for type `onlineapp.Foo` static if(true) alias B = int; } void main(){} ```
Jan 18 2022