www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - UDAs and no complaints about "need 'this'"

reply "John Colvin" <john.loughran.colvin gmail.com> writes:
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.
Apr 09 2015
next sibling parent "jkpl" <jkpl nowhere.fr> writes:
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.
Apr 09 2015
prev sibling parent "Maxim Fomin" <maxim-fomin outlook.com> writes:
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.
For me it seems to fit into D type system (which is not necessarily is a good idea). struct S { int i; } alias S.i si; void main(){ /*si++;*/} Behavior of D depends sometimes on it internals, not on programmers' expectations. Since D has never been stabilized, the boundary between WAT and bugs is partially undefined.
Apr 09 2015