Thread overview
Can't get UDAs of constants (enums) !
Jun 24, 2017
Johan Engelen
Jun 24, 2017
Meta
Jun 24, 2017
ketmar
Jun 24, 2017
Johan Engelen
Jun 25, 2017
Timon Gehr
Jun 29, 2017
Walter Bright
June 24, 2017
This code no longer compiles (regression since 2.072, [1]):
```
module example;
import std.meta: staticIndexOf;

struct Attrib {}

@Attrib enum TEST = 123;

void foo() {
    foreach(name; __traits(allMembers, example)) {
        pragma(msg, name);
        pragma(msg, __traits(getAttributes, __traits(getMember, example, name)));
    }
}
```

Does anybody know a workaround? (the intent is to loop over all module members that have a certain UDA applied)
It's currently blocking Weka from updating to a newer compiler. :(

You can play with code live here: https://godbolt.org/g/G8Yw59
Switch between LDC 1.1.0 (dlang 2.071) and LDC 1.2.0 (dlang 2.072).

Thanks,
  Johan

[1]  https://issues.dlang.org/show_bug.cgi?id=17545


June 24, 2017
On Saturday, 24 June 2017 at 17:42:48 UTC, Johan Engelen wrote:
> This code no longer compiles (regression since 2.072, [1]):
> ```
> module example;
> import std.meta: staticIndexOf;
>
> struct Attrib {}
>
> @Attrib enum TEST = 123;
>
> void foo() {
>     foreach(name; __traits(allMembers, example)) {
>         pragma(msg, name);
>         pragma(msg, __traits(getAttributes, __traits(getMember, example, name)));
>     }
> }
> ```
>
> Does anybody know a workaround? (the intent is to loop over all module members that have a certain UDA applied)
> It's currently blocking Weka from updating to a newer compiler. :(
>
> You can play with code live here: https://godbolt.org/g/G8Yw59
> Switch between LDC 1.1.0 (dlang 2.071) and LDC 1.2.0 (dlang 2.072).
>
> Thanks,
>   Johan
>
> [1]  https://issues.dlang.org/show_bug.cgi?id=17545

Looks like I responded a bit too quickly; I didn't even read the title so I didn't notice that you already identified the actual cause. Sorry for the redundant post.
June 24, 2017
Johan Engelen wrote:

> This code no longer compiles (regression since 2.072, [1]):
> ```
> module example;
> import std.meta: staticIndexOf;
>
> struct Attrib {}
>
> @Attrib enum TEST = 123;
>
> void foo() {
>      foreach(name; __traits(allMembers, example)) {
>          pragma(msg, name);
>          pragma(msg, __traits(getAttributes, __traits(getMember, example, name)));
>      }
> }
> ```
>
> Does anybody know a workaround? (the intent is to loop over all module members that have a certain UDA applied)
> It's currently blocking Weka from updating to a newer compiler. :(
>
> You can play with code live here: https://godbolt.org/g/G8Yw59
> Switch between LDC 1.1.0 (dlang 2.071) and LDC 1.2.0 (dlang 2.072).
>
> Thanks,
>    Johan
>
> [1]  https://issues.dlang.org/show_bug.cgi?id=17545

`std.traits.getSymbolsByUDA()` will allow to select all symbols with the given UDA. yet you'll still have `123` instead of a `TEST` as a result.

i'm not sure that this is a real bug, tho: such enums doesn't meant to exist as separate entities, they meant to be macro-like, pasting their value.

i.e. i myself wont complain, but i may be completely wrong here, and this may be a real bug.
June 24, 2017
On Saturday, 24 June 2017 at 17:42:48 UTC, Johan Engelen wrote:
>
> Does anybody know a workaround?

I got something with mixins now that seems to work.
```
void foo(string modname)() {
    mixin("static import mod = " ~ modname ~ ";");
    foreach(name; __traits(allMembers, mod)) {
        pragma(msg, name);
        pragma(msg, mixin("__traits(getAttributes, " ~ modname ~ "." ~ name ~")"));
    }
}
```
June 25, 2017
On 24.06.2017 19:42, Johan Engelen wrote:
> This code no longer compiles (regression since 2.072, [1]):
> ```
> module example;
> import std.meta: staticIndexOf;
> 
> struct Attrib {}
> 
> @Attrib enum TEST = 123;
> 
> void foo() {
>      foreach(name; __traits(allMembers, example)) {
>          pragma(msg, name);
>          pragma(msg, __traits(getAttributes, __traits(getMember, example, name)));
>      }
> }
> ```
> 
> Does anybody know a workaround? (the intent is to loop over all module members that have a certain UDA applied)
> It's currently blocking Weka from updating to a newer compiler. :(
> 
> You can play with code live here: https://godbolt.org/g/G8Yw59
> Switch between LDC 1.1.0 (dlang 2.071) and LDC 1.2.0 (dlang 2.072).
> 
> Thanks,
>    Johan
> 
> [1]  https://issues.dlang.org/show_bug.cgi?id=17545
> 
> 


FWIW: This seems to fix the problem:
https://github.com/dlang/dmd/compare/master...tgehr:fix17545

I don't really understand why though.
June 29, 2017
On 6/24/2017 10:42 AM, Johan Engelen wrote:
> [1]  https://issues.dlang.org/show_bug.cgi?id=17545

https://github.com/dlang/dmd/pull/6949