`in` parameters made useful

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Aug 22 16:23:41 UTC 2020


On 8/22/20 2:07 AM, Araq wrote:
> On Friday, 21 August 2020 at 19:21:37 UTC, Andrei Alexandrescu wrote:
>> On 8/21/20 1:20 AM, Araq wrote:
>>> On Thursday, 20 August 2020 at 22:19:16 UTC, Andrei Alexandrescu wrote:
>>>> On 8/20/20 1:31 PM, IGotD- wrote:
>>>>> [...]
>>>>
>>>> This has been discussed a few times. If mutation is allowed, 
>>>> aliasing is a killer:
>>>>
>>>> void fun(ref S a, const compiler_chooses S b) {
>>>>     ... mutate a, read b ...
>>>> }
>>>>
>>>> S x;
>>>> fun(x, x); // oops
>>>>
>>>> The problem now is that the semantics of fun depends on whether the 
>>>> compiler chose pass by value vs. pass by reference.
>>>
>>> True but in practice it doesn't happen very often. The benefits far 
>>> outweigh this minor downside.
>>
>> That seems quite worrisome. A bug rare and subtle that can become 
>> devastating. Something the Hindenburg captain might have said.
>>
>>> Plus there are known ways to prevent this form of aliasing at 
>>> compile-time.
>>
>> Not if you have globals and/or separate compilation.
> 
> Wrong. You can simply compile it to 'fun(x, copy(x))' if an alias 
> analysis cannot disambiguate the locations and the alias analysis is 
> restricted to the callsite, separate compilation continues to work.

Fair enough, thanks.


More information about the Digitalmars-d mailing list