@Araq, I have went through the new proposal. I have one suggestion to consider.
In a new proposal sink was replaced with move to make self assignment works.
Was:
proc =sink(a: var X, b: X)
Run
Became:
proc =move(a: var X, b: var X)
Run
Move makes self assigment safe, but makes let variables not movable, which is
noticeable limitation.
Alternative suggestion:
proc =sink(a: var X, b: X): bool
Run
It is the same sink as before, but returns a bool that indicates if the move
has happened or not. If false was return then b should not be destroyed
afterwards. Benefits: const and let variables can be moved without
restrictions. Once you read it first it may sound as a fudge, in my opinion the
fact that =move needs to change the source is even bigger fudge that is C++ big
disadvantage. Let variables are quite common and useful and with =move their
use will be discouraged.