[Issue 14346] New: is-expression dependent on instantiation order
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Thu Mar 26 08:59:47 PDT 2015
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 at puremagic.com
Reporter: schuetzm at 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.
--
More information about the Digitalmars-d-bugs
mailing list