On Thursday, 9 April 2015 at 09:53:15 UTC, John Colvin wrote:
struct BigLongStructName
{
        int evenLongerMemberName;
}

struct QN{}

unittest
{
        BigLongStructName bigLongStructName;

        @(bigLongStructName.evenLongerMemberName)
                QN quickName;
        
        __traits(getAttributes, quickName)[0]++;
}

Is it just me or is it weird that this works? Once you pull the UDA out from being a storage class and attempt to alias it, you get the usual "need 'this' for 'evenLongerMemberName' of type 'int'" error messages on use.

Why are UDAs so special? I don't believe there's any other way to achieve this sort of effective renaming.

I think it's an error. When the attribute is a struct, it looks like the member is processed as a static variable. But the equivalent with a class raises an AV:

---
class BigLongStructName
{
        int evenLongerMemberName;
}

struct QN{}

unittest
{
    import std.stdio;

        BigLongStructName bigLongStructName;

        @(bigLongStructName.evenLongerMemberName)
                QN quickName;
        
        __traits(getAttributes, quickName)[0]++;
}
---

which is a totally expected behaviour.

Reply via email to