Pure Factory Functions 💔 `inout`

Quirin Schroll qs.il.paperinik at gmail.com
Tue Feb 21 10:46:55 UTC 2023


On Friday, 10 February 2023 at 14:37:35 UTC, ag0aep6g wrote:
> On Friday, 10 February 2023 at 14:00:20 UTC, Steven 
> Schveighoffer wrote:
>> It can be weakly pure. The docs are wrong.
>>
>> i.e. this works:
>>
>> ```d
>> pure int *foo(const int *p)
>> {
>>    return new int(5);
>> }
>>
>> void main()
>> {
>>    int x;
>>    immutable int * bar = foo(&x);
>> }
>> ```
>
> That function "has no parameters with mutable indirections". So 
> it's strongly pure, not weakly pure.

Uniqueness analysis depends on the return type as much as on 
parameter types.

In Steve’s example, `foo` does have parameters with mutable 
indirections (as I interpret that phrase – it’s honestly not 
precise wording) because `const` allows binding mutable values. 
The reason Steve’s example compiles is that by thorough 
investigation of parameter and return types, the compiler comes 
to the conclusion that there is no way `p`, which is a 
`const(int)*` makes it into the return value, and *therefore* the 
result must be uniquely created and thus may be cast to 
`immutable`. If you change the return type of `foo` to 
`const(int)*` (cf. `goo` in the example below), the parameter’s 
value could make it into the result and because `p` may be bound 
to mutable, the result cannot be cast to `immutable` implicitly:
```d
pure @safe       int * foo(const(int)* p) { return new int(1); }
pure @safe const(int)* goo(const(int)* p) { return new int(1); }

void main() @safe
{
     auto p = new int;
     immutable a = foo(p); // ok
     immutable b = goo(p); // error
}
```


More information about the Digitalmars-d mailing list