In the following code, I can pass a non-scope
argument to a function expecting a scope
parameter, but I can't pass a scope
argument. That seems backwards?
@safe @nogc pure nothrow:
void main() {
string[2] notScope = ["one", "two"];
f(notScope);
scope string[2] yesScope = ["one", "two"];
f(yesScope);
}
void f(scope string[] expectingScope) {}
Output (of dmd a.d -preview=dip1000
):
a.d(8): Error: cannot take address of `scope` local `yesScope` in `@safe` function `main`
a.d(8): Error: cannot cast expression `yesScope` of type `string[2]` to `string[]`
The error only happens in dmd 2.099.0 -- it didn't happen in 2.098.1 .
There is another even simpler case that doesn't work in either version:
@safe @nogc pure nothrow:
void main() {
scope string[2] xs = ["one", "two"];
foreach (scope immutable string x; xs) {}
}
Output (of dmd a.d -preview=dip1000
):
a.d(5): Error: cannot take address of `scope` local `xs` in `@safe` function `main`