Possible to pass a member function to spawn?

Timon Gehr timon.gehr at gmx.ch
Wed Feb 8 10:51:31 PST 2012


On 02/08/2012 07:30 PM, Artur Skawina wrote:
> On 02/08/12 18:24, Timon Gehr wrote:
>>
>> Open issue:
>>
>> void main(){
>>      unique x = new C;
>>      pragma(msg, typeof(x.z)); // ???
>>      auto y = x.z; // error?
>>      immutable z = x;
>> }
>>
>> x.z is not necessarily unique, but assigning it to y breaks the guarantees of the unique qualifier of x.
>
> This is why treating "unique" as a static storage class doesn't really work. One
> of the two last lines above would have to be disallowed,


Actually that is not true. It could type check, because y is not alive 
after x has been cast to immutable.

The problem shows here:

void main(){
     unique x = new C;
     auto y = x.z;
     immutable z = x;
     foo(y,z);
}


> and that reduces its usefulness dramatically.

Can you show me an example of its use?

> The "auto" assignment either has to be illegal, or
> trigger a mutation, eg to immutable. I don't think having the compiler keep
> track of all possible relations would be a practical solution, even if theoretically
> possible.

I think it would be practical enough.

typeof(C.z) global;

void main(){
     unique x = new C;
     auto y = x.z;
     static assert(!is(typeof(y)==immutable));
     static assert(!is(typeof({global = y;}));
     immutable z = x;
     static assert(is(typeof(y)==immutable));
     static assert(is(typeof(x)==immutable);
     foo(y,z);
}

>
> For those not reading D.learn - unique helps in other cases too:
> http://lists.puremagic.com/pipermail/digitalmars-d-learn/2012-February/029547.html
>
> artur



More information about the Digitalmars-d mailing list