[dmd-beta] ref semantics

Michel Fortin michel.fortin at michelf.com
Thu Apr 12 04:40:58 PDT 2012


Le 2012-04-11 à 0:56, Andrei Alexandrescu a écrit :

> On 4/10/12 11:50 PM, Jonathan M Davis wrote:
>> On Tuesday, April 10, 2012 23:33:11 Andrei Alexandrescu wrote:
>>> I think this all holds water. Destroy!
>> 
>> So, this essentially erases the difference between lvalues and rvalues as far
>> as ref is concerned? ref will effectively have nothing to do with lvalues or
>> rvalues?
> 
> Except when an implicit conversion is in the mix, yes. It's conversions and escapes that spoil things. We disallow conversion results to bind to ref and abolish ref escapes altogether, so I think we should be fine.

Speaking of ref escapes, perhaps it'd be a good time to remind ourselves of this hole:

	ref int foo(ref int i)
	{
		return i;
	}

	ref int bar()
	{
		int i;
		return foo(i);
	}

	void main()
	{
		bar() += 1; // what are we incrementing again?
	}

The way ref will work now makes makes it possible to define bar like this instead, which would result in the same generated code:

	ref int bar()
	{
		return foo(1);
	}

Now the problem is a little more hidden from sight.

I don't see that as a problem of the new ref behaviour (which I like), but since we're looking at ref semantics I thought it'd be good to have a reminder that there's still an important hole related to ref in need of some attention.

<http://d.puremagic.com/issues/show_bug.cgi?id=3925>


-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/





More information about the dmd-beta mailing list