Thread overview
alias and __VERSION__ condition doesn't play well
Jan 18, 2022
frame
Jan 18, 2022
vit
Jan 18, 2022
Paul Backus
Jan 18, 2022
vit
Jan 19, 2022
vit
January 18, 2022

At the very top of my module I have this declaration:

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:

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

Is there a reason for that?

January 18, 2022

On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:

>

At the very top of my module I have this declaration:

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:

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:

import std.traits : Select;

alias Foo  = Select!(__VERSION__ >= 2098, TypeA, TypeB);
January 18, 2022

On Tuesday, 18 January 2022 at 04:42:45 UTC, frame wrote:

>

At the very top of my module I have this declaration:

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

January 18, 2022

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:

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

January 18, 2022

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:

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

January 19, 2022

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:

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:

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(){}