Re: alias and __VERSION__ condition doesn't play well

2022-01-18 Thread vit via Digitalmars-d-learn
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(){}
```




Re: alias and __VERSION__ condition doesn't play well

2022-01-18 Thread Steven Schveighoffer via Digitalmars-d-learn

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


Re: alias and __VERSION__ condition doesn't play well

2022-01-18 Thread vit via Digitalmars-d-learn

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


Re: alias and __VERSION__ condition doesn't play well

2022-01-18 Thread Paul Backus via Digitalmars-d-learn

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


Re: alias and __VERSION__ condition doesn't play well

2022-01-17 Thread vit via Digitalmars-d-learn

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);
```


alias and __VERSION__ condition doesn't play well

2022-01-17 Thread frame via Digitalmars-d-learn

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?