What is the state of scope function parameter?
via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Mar 29 04:18:24 PDT 2017
On Wednesday, 29 March 2017 at 05:15:33 UTC, Ali Çehreli wrote:
> (More correctly, "scope storage class".)
>
> https://dlang.org/spec/function.html#Parameter
>
> still says
>
> scope: references in the parameter cannot be escaped
> (e.g. assigned to a global variable). Ignored for
> parameters with no references
>
> However, it doesn't behave that way. For example, my example
> here currently is a lie because there is no compilation error
> with 2.073.2:
>
>
> http://ddili.org/ders/d.en/function_parameters.html#ix_function_parameters.scope
>
> What's the truth? How would you change the text there?
>
> Thank you,
> Ali
The truth is that almost non of the scope checks are on, unless
you compile with -dip1000:
$ source ~/dlang/dmd-2.073.2/activate
$ dmd ddili_scope_test1.d
$ echo $?
0
$ dmd -dip1000 ddili_scope_test1.d
ddili_scope_test1.d(5): Error: scope variable parameter may not
be returned
Now that's one error, out of two expected, so what's going on
here? As DIP1000 mentions
(https://github.com/dlang/DIPs/blob/master/DIPs/DIP1000.md#safe):
> Errors for scope violations are only reported in @safe code.
So if when I changed the code to:
int[] globalSlice;
int[] foo(scope int[] parameter) @safe {
globalSlice = parameter; // ← compilation ERROR
return parameter; // ← compilation ERROR
}
void main() {
int[] slice = [ 10, 20 ];
int[] result = foo(slice);
}
I got:
$ dmd -dip1000 ddili_scope_test1.d
ddili_scope_test1.d(4): Error: scope variable parameter assigned
to non-scope globalSlice
ddili_scope_test1.d(5): Error: scope variable parameter may not
be returned
Just as expected.
More information about the Digitalmars-d-learn
mailing list