DMD Symbol Reference Analysis Pass

via Digitalmars-d digitalmars-d at puremagic.com
Wed May 27 01:30:32 PDT 2015


On Tuesday, 26 May 2015 at 21:22:38 UTC, Per Nordlöw wrote:
> No, DMD cannot currently handle scope on foreach elements. It 
> errors as
>
>      Error: basic type expected, not scope
>

Quite possible, didn't test it. Anyway, my point was that it 
simply isn't necessary to ever mark a local variable as `scope`. 
The compiler sees all local variables and can figure things out 
by itself. It only needs help in function signatures, in the form 
of explicit `scope` and `return` annotations.

>> example, it would figure out that you're assigning a reference 
>> to a value with shorter lifetime (i.e. the slice to the 
>> buffer) to a value with longer lifetime (saved_line), which it 
>> would disallow. (Btw, I don't think to!string is enough, 
>> because it is probably a no-op in this case: string -> string).
>
> No to!string is not a no-op in this case. It allocates but it 
> needs to create an immutable char array that is: char[] -> 
> string

I see, File.byLine returns a range of char[], I thought it 
returned a string range. Then you're of course right.

>
>> However, byLine has another problem, which boils down to the 
>> same cause as the problem with RCArray, namely that the 
>> content of the buffer is reused in each iteration.
>
> This is what I meant with volatile. Is there a better word for 
> this?

I guess it's fine, and now I remember again that ranges with this 
property have been called "volatile ranges".

>
>> the "owner" can be modified while references to it exist. For 
>> byLine, this is not a safety violation, but for RCArray it is. 
>> A solution applicable to both is to detect this and then 
>> either treat such a situation as @system, or make the owner 
>> `const` as long as the references are alive.
>
> AFAIK: Allowing scope in foreach would solve this problem in my 
> case.

See above. Conceptually, you can of course treat it as if it were 
marked with `scope`, but an actual annotation should not be 
necessary.


More information about the Digitalmars-d mailing list