digitalmars.D.learn - getSymbolByUDA and inheritance
- Arafel (46/46) Apr 19 2018 Hi,
Hi, getSymbolsByUDA doesn't work when inheritance is involved [1]: ``` import std.traits; void main() { pragma(msg, getSymbolsByUDA!(A,S).length); pragma(msg, getSymbolsByUDA!(B,S).length); } class A { S("A") int a; } class B : A { S("B") int b; } struct S { string name; } ``` The error message seems a bit weird, and after some tinkering, I've been able to reproduce it when creating an AliasSeq with members of both the parent and the child class [2]: ``` import std.meta; void main() { pragma(msg, AliasSeq!(__traits(getMember, B, "a"), __traits(getMember, B, "b"))); } class A { int a; } class B : A { int b; } ``` It seems that using __traits(getMember,...) is introducing some kind of hidden context to the actual class that defines the member... It looks like a bug to me, but there might be a reason to do it this way. Still, whatever the reason, it definitely breaks getSymbolsByUDA when inheritance is involved. According to the documentation [3] only nested members are excluded (and in any they are just excluded, but still compile), so is this a bug? [1]: https://run.dlang.io/is/502CUB [2]: https://run.dlang.io/is/9wOIsa [3]: https://dlang.org/library/std/traits/get_symbols_byuda.html
Apr 19 2018