Copy Constructor DIP

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Jul 12 15:32:27 UTC 2018


On 07/12/2018 11:22 AM, Timon Gehr wrote:
> On 12.07.2018 15:29, Andrei Alexandrescu wrote:
>> On 07/11/2018 05:55 AM, Nick Treleaven wrote:
>>> ...
>>>
>>> Removing `static` works. Otherwise I tried changing `ref` to `alias`:
>>>
>>> Error: variable src cannot be read at compile time
>>>
>>> But this shorter code seems to work fine:
>>>
>>> this.tupleof = src.tupleof;
>>
>> Odd. Timon, what would be the reason for that error? Razvan, can you 
>> please look into removing "static" for now. Thanks!
> 
> The reason for this specific error is that `src.i` is neither a symbol 
> nor a constant value. tupleof is a case of built-in compiler magic, 
> because it can produce an expression tuple that contains run-time values 
> that are not symbols. The following (manually unrolled) code also does 
> not work:
> 
> alias field0 = s.tupleof[0];
> t.tupleof[0] = field0;
> alias field1 = s.tupleof[1];
> t.tupleof[1] = field1;
> alias field2 = s.tupleof[2];
> t.tupleof[2] = field2;
> 
> Error: alias `a` cannot alias an expression `tuple(s.a, s.b, s.c)[0]`
> Error: alias `b` cannot alias an expression `tuple(s.a, s.b, s.c)[1]`
> Error: alias `c` cannot alias an expression `tuple(s.a, s.b, s.c)[2]`
> 
> It could be argued that the `static foreach` implementation should 
> produce the same error message. (The fact that the AliasDecl constructor 
> takes a Dsymbol instead of an Expression has led to multiple 
> reimplementations of parts of the aliasing logic in different parts of 
> the DMD code, `static foreach` is using the same implementation also 
> used by unrolled foreach, and it requires that all loop variables are 
> either symbols or constant values, while unrolled foreach can fall back 
> to introducing runtime variables for this special case.)
> 
> One way to fix is to lift all the unnecessary limitations that are 
> introduced by the fact that the AliasDecl constructor takes a Dsymbol. 
> I.e. that "you can only alias symbols".
> 
> Alternatively, it would be possible to redefine `static foreach` 
> statements such that they work for any aggregate with statically known 
> length and element types, and to allow run-time loop variables to be 
> generated when iterating over run-time values.

Thanks!


More information about the Digitalmars-d mailing list