digitalmars.D - Can't get UDAs of constants (enums) !
- Johan Engelen (23/23) Jun 24 2017 This code no longer compiles (regression since 2.072, [1]):
- Meta (4/28) Jun 24 2017 Looks like I responded a bit too quickly; I didn't even read the
- ketmar (8/30) Jun 24 2017 `std.traits.getSymbolsByUDA()` will allow to select all symbols with the...
- Johan Engelen (12/13) Jun 24 2017 I got something with mixins now that seems to work.
- Timon Gehr (4/35) Jun 24 2017 FWIW: This seems to fix the problem:
- Walter Bright (2/3) Jun 29 2017 https://github.com/dlang/dmd/pull/6949
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
Jun 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=17545Looks 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.
Jun 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.
Jun 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 ~")")); } } ```
Jun 24 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=17545FWIW: This seems to fix the problem: https://github.com/dlang/dmd/compare/master...tgehr:fix17545 I don't really understand why though.
Jun 24 2017
On 6/24/2017 10:42 AM, Johan Engelen wrote:[1] https://issues.dlang.org/show_bug.cgi?id=17545https://github.com/dlang/dmd/pull/6949
Jun 29 2017