Deprecating this(this)

Nicholas Wilson iamthewilsonator at hotmail.com
Mon Apr 2 00:25:52 UTC 2018


On Sunday, 1 April 2018 at 17:08:37 UTC, Andrei Alexandrescu 
wrote:
> On 4/1/18 10:59 AM, Nicholas Wilson wrote:
>> for 1. consider
>> immutable foo = ...;
>> immutable bar = foo;
>> to be
>> immutable foo = ...;
>> immutable bar = () {mutable _ = bitcopy(foo); _.__postblit(); 
>> return _;}();
>
> Negative. The problem is typechecking postblit itself, not its 
> invocation.

Nit sure that I follow but, see comment below on your immutable 
example.

>> for 2. you would have to synchronize anyway for shared, it 
>> makes no difference.
>
> Negative. Consider:
>
> shared struct Point
> {
>     private long x, y, z;
>     private Mutex mutex;
>     ...
> }
>
> Task: define the copy primitive of Point so atomically copy x, 
> y, and z using mutex. The problem is, the compiler will memcpy 
> the three longs non-atomically before the user even gets a 
> crack at intercepting the operation.
>

What I meant was:
Point p = ...;
auto pp = p; // bit copy + postblit = WRONG
Point pp;
synchronized (p.mutex) { pp = p; } // synchronised: bitcopy is 
inseparable from the postblit

Perhaps there is a way to make that automatic / nicer to use?

> [...]
> int[] sneaky;
> struct A
> {
>     private int[] innocent;
>     this(this)
>     {
>         sneaky = innocent;
>     }
> }
> void main()
> {
>     immutable a = A([1, 2, 3]);
>     auto b = a;
>     sneaky[1] = 42; // oops
>     import std.stdio;
>     writeln(a.innocent); // ooooops
> }
>
> Sadly this (and many similar ones) compiles and runs 
> warning-free on today's compiler. We really need to close this 
> loop, like, five years ago.

How much of this class of bug would be eliminated by requiring 
that `this(this)` be pure for assignment to const and immutable 
objects? Arguably this(this) should always be pure in any sane 
program. The only reason I can think of is if you're trying to 
perf the number of copies you're making, but there is compiler 
help for that.




More information about the Digitalmars-d mailing list