digitalmars.D.bugs - [Issue 14346] New: is-expression dependent on instantiation order
- via Digitalmars-d-bugs (58/58) Mar 26 2015 https://issues.dlang.org/show_bug.cgi?id=14346
https://issues.dlang.org/show_bug.cgi?id=14346 Issue ID: 14346 Summary: is-expression dependent on instantiation order Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: normal Priority: P1 Component: DMD Assignee: nobody puremagic.com Reporter: schuetzm gmx.net This is a really weird bug. Here's how far I could reduce it: struct Validate() { this(string ) { } } template isConvertibleToInstanceOf(alias From, alias To) { enum isConvertibleToInstanceOf = isConvertibleToInstanceOf!(typeof(From), To); } template isConvertibleToInstanceOf(From, alias To) { enum isConvertibleToInstanceOf = is(From : To!Args, Args...); } template Validation() { void validate() { // run validators for members foreach(member; __traits(allMembers, typeof(this))) { foreach(UDA; __traits(getAttributes, mixin(member))) { // THE FOLLOWING LINE IS MAGIC static if(isConvertibleToInstanceOf!(UDA, Validate)) { } // --------------------------- } } // run validators for entire object foreach(UDA; __traits(getAttributes, typeof(this))) { // THE RESULT OF THIS IS-EXPR DEPENDS ON THE LINE ABOVE: static if(isConvertibleToInstanceOf!(UDA, Validate)) pragma(msg, "isConvertibleToInstanceOf: ", typeof(UDA)); } } } struct EmbeddedType { } EmbeddedType Embedded; Embedded class Address { Validate!()("invalid country") string country; mixin Validation; } When the first `static if` is there, the `pragma` prints "isConvertibleToInstanceOf: EmbeddedType". But if it is removed or commented out, the `pragma` isn't called; evidently the second `static if` fails. --
Mar 26 2015