www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Behaviour of alias this changed

reply "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
I have some code along these lines:

	struct S {
		short[4] data;
		alias this data;

		string toString() { ... }
	}
	...
	S s;
	writeln(to!string(s));

In dmd 2.059 (I believe) and earlier, this calls S.toString(). However,
in git dmd, this calls data.toString() instead.

I'm just curious about the rationale for this change, and whether
there's a way to override the toString() call so that it always calls
S.toString()?


T

-- 
To err is human; to forgive is not our policy. -- Samuel Adler
May 08 2012
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 05/08/2012 10:11 AM, H. S. Teoh wrote:
 I have some code along these lines:

 	struct S {
 		short[4] data;
 		alias this data;

 		string toString() { ... }
 	}
 	...
 	S s;
 	writeln(to!string(s));

 In dmd 2.059 (I believe) and earlier, this calls S.toString(). However,
 in git dmd, this calls data.toString() instead.

 I'm just curious about the rationale for this change, and whether
 there's a way to override the toString() call so that it always calls
 S.toString()?


 T

Just a guess: It could be related to const-correctness improvements. Try defining S.toString() as const. Ali -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
May 08 2012
next sibling parent "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Tue, May 08, 2012 at 10:15:00AM -0700, Ali «ehreli wrote:
 On 05/08/2012 10:11 AM, H. S. Teoh wrote:
I have some code along these lines:

	struct S {
		short[4] data;
		alias this data;

		string toString() { ... }
	}
	...
	S s;
	writeln(to!string(s));

In dmd 2.059 (I believe) and earlier, this calls S.toString(). However,
in git dmd, this calls data.toString() instead.

I'm just curious about the rationale for this change, and whether
there's a way to override the toString() call so that it always calls
S.toString()?


[...]
 Just a guess: It could be related to const-correctness improvements.
 Try defining S.toString() as const.

[...] I tried that, it didn't help. Declaring string toString() const {...} still has data.toString being called instead of S.toString. T -- Today's society is one of specialization: as you grow, you learn more and more about less and less. Eventually, you know everything about nothing.
May 08 2012
prev sibling next sibling parent "Jonathan M Davis" <jmdavisProg gmx.com> writes:
On Tuesday, May 08, 2012 10:30:53 H. S. Teoh wrote:
 On Tue, May 08, 2012 at 10:15:00AM -0700, Ali Çehreli wrote:
 On 05/08/2012 10:11 AM, H. S. Teoh wrote:
I have some code along these lines:
 struct S {
 
 short[4] data;
 alias this data;
 
 string toString() { ... }
 
 }
 ...
 S s;
 writeln(to!string(s));

In dmd 2.059 (I believe) and earlier, this calls S.toString(). However,
in git dmd, this calls data.toString() instead.

I'm just curious about the rationale for this change, and whether
there's a way to override the toString() call so that it always calls
S.toString()?


[...]
 Just a guess: It could be related to const-correctness improvements.
 Try defining S.toString() as const.

[...] I tried that, it didn't help. Declaring string toString() const {...} still has data.toString being called instead of S.toString.

There's also safe, pure, and nothrow. As I understand it, toString will eventually need to have all 4 of those attributes. pure doesn't work very well for toString yet though, since most of the string-related conversion functions can't be pure yet due to impure low level constructs that they use. - Jonathan M Davis
May 08 2012
prev sibling parent "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Tue, May 08, 2012 at 01:52:14PM -0400, Jonathan M Davis wrote:
 On Tuesday, May 08, 2012 10:30:53 H. S. Teoh wrote:
 On Tue, May 08, 2012 at 10:15:00AM -0700, Ali «ehreli wrote:
 On 05/08/2012 10:11 AM, H. S. Teoh wrote:
I have some code along these lines:
 struct S {
 
 short[4] data;
 alias this data;
 
 string toString() { ... }
 
 }
 ...
 S s;
 writeln(to!string(s));




[...]
 I tried that, it didn't help. Declaring string toString() const
 {...} still has data.toString being called instead of S.toString.

There's also safe, pure, and nothrow. As I understand it, toString will eventually need to have all 4 of those attributes. pure doesn't work very well for toString yet though, since most of the string-related conversion functions can't be pure yet due to impure low level constructs that they use.

[...] Yes, it would be nice to finally make toString const safe pure and nothrow. But the question still stands: what to do with the different behaviour of alias this in git dmd? T -- Famous last words: I wonder what will happen if I do *this*...
May 08 2012