dmd 1.054 and 2.038 release

Steven Schveighoffer schveiguy at yahoo.com
Fri Jan 1 07:29:21 PST 2010


On Thu, 31 Dec 2009 16:20:08 -0500, Walter Bright  
<newshound1 at digitalmars.com> wrote:

> Steven Schveighoffer wrote:
>>> (I'm assuming bug 1961('scoped const') is considered to be fixed).
>>  Sadly, it's not fixed yet :(
>>   struct S
>> {
>>     int x;
>>     inout(int)* getX() inout { return &x;}
>> }
>>  void main()
>> {
>>     S s;
>>     int *x = s.getX();
>> }
>>   testinout.d(10): Error: function testinout.S.getX () inout is not  
>> callable using argument types ()
>> testinout.d(10): Error: cannot implicitly convert expression (s.getX())  
>> of type inout(int)* to int*
>>  It appears the auto-conversion is not happening on the return, and  
>> also the call isn't working.
>
> The inout on the return has to be at the top level, as in inout(int *).  
> This probably needs improvement.

Yes, this is an important distinction.

With your recommended change, the error is now:

testinout.d(4): Error: inout on return means inout must be on a parameter  
as well for inout inout(int*)()

inout doesn't seem to work with ref either.  The only thing I could get to  
work is this:


struct S
{
     int x;
}

inout(int *) getSX(inout S* s) { return &s.x;}

void main()
{
     S s;
     const(S)* sp = &s;
     int *x = getSX(&s);
     //int *y = getSX(sp);  // uncomment this line for an error
     const(int) *y = getSX(sp);
}

If you uncomment the designated line, the error reads:

testinout.d(13): Error: cannot implicitly convert expression (getSX(sp))  
of type const(int*) to int*

which looks good.

-Steve


More information about the Digitalmars-d-announce mailing list