digitalmars.D.learn - traits compiles does not work for symbols from other modules
- Andre Pany (37/37) Jul 24 2017 Hi,
- ag0aep6g (2/30) Jul 25 2017 Works for me. What compiler are you using?
- Andre Pany (32/34) Jul 25 2017 I reduced the example too lot. The issue is occuring if there is
- Andre Pany (5/39) Jul 25 2017 Issue created: https://issues.dlang.org/show_bug.cgi?id=17683
Hi,
I want to validate whether a class contains a specific attribute.
I have the attribute name as compile time string. This string
could either be a direct attribute of the class or a hierarchy
(TextSettings.Font.Size).
As example T is the class Label and p.name contains the text
"TextSettings.Font.Size".
TextSettings and Font are again classes.
mixin(`static if (__traits(compiles,
`~fullyQualifiedName!T~`.`~p.name~`)) {...}
__traits(compiles, ...) only works for symbols of the same
module, but not for symbols contained in other modules. I reduced
it to this example coding:
m1.d
-----------------
module m1;
import m2;
class Foo
{
int foo;
}
void main()
{
static assert(__traits(compiles, m1.Foo.foo));
static assert(__traits(compiles, m2.Bar.bar));
}
m2.d
---------------
module m2;
class Bar
{
int bar;
}
Why does the second assert throws? What can I use instead of
__traits(compiles,...) ?
Kind regards
André
Jul 24 2017
On 07/24/2017 11:40 PM, Andre Pany wrote:
m1.d
-----------------
module m1;
import m2;
class Foo
{
int foo;
}
void main()
{
static assert(__traits(compiles, m1.Foo.foo));
static assert(__traits(compiles, m2.Bar.bar));
}
m2.d
---------------
module m2;
class Bar
{
int bar;
}
Why does the second assert throws? What can I use instead of
__traits(compiles,...) ?
Works for me. What compiler are you using?
Jul 25 2017
On Tuesday, 25 July 2017 at 08:30:43 UTC, ag0aep6g wrote:Works for me. What compiler are you using?I reduced the example too lot. The issue is occuring if there is also a package.d is involved. m1.d ----------------------- module m1; import sub; // Does not throw if replaced with: import sub.m2; class Foo { int foo; } void main() { static assert(__traits(compiles, m1.Foo.foo)); mixin(`static assert(__traits(compiles, sub.m2.Bar.bar));`); } sub/m2.d ---------------------- module sub.m2; class Bar { int bar; } sub/package.d ---------------------- module sub; public import sub.m2; I use DMD master (as I already need the static foreach) on windows 10. DMD32 D Compiler v2.075.0-rc1-master-af3eacfKind regards Andrédmd -run m1.d sub/package.d sub/m2.d
Jul 25 2017
On Tuesday, 25 July 2017 at 11:34:23 UTC, Andre Pany wrote:On Tuesday, 25 July 2017 at 08:30:43 UTC, ag0aep6g wrote:Issue created: https://issues.dlang.org/show_bug.cgi?id=17683 Is there a known workaround? Kind regards AndréWorks for me. What compiler are you using?I reduced the example too lot. The issue is occuring if there is also a package.d is involved. m1.d ----------------------- module m1; import sub; // Does not throw if replaced with: import sub.m2; class Foo { int foo; } void main() { static assert(__traits(compiles, m1.Foo.foo)); mixin(`static assert(__traits(compiles, sub.m2.Bar.bar));`); } sub/m2.d ---------------------- module sub.m2; class Bar { int bar; } sub/package.d ---------------------- module sub; public import sub.m2; I use DMD master (as I already need the static foreach) on windows 10. DMD32 D Compiler v2.075.0-rc1-master-af3eacfKind regards André[...]
Jul 25 2017








Andre Pany <andre s-e-a-p.de>