In @safe: void f(scope const(char)[]) {} void g(scope const(char)[][]) {} unittest { string x; f(x); string[] y; g(y); } g() should be allowed. Instead it currently fails function `foo.g(scope const(char)[][] _param_0)` is not callable using argument types `(string[])` (d-dmd) cannot pass argument `y` of type `string[]` to parameter `scope const(char)[][] _param_0` (d-dmd) Perhaps conversion should be allowed in `g()` without `scope` qualifier as long as `f()` allows it.
Conversion from `immutable(char)[][]` to `const(char)[][]` is not sound. Consider: immutable(char)[][] i = [""]; const(char)[][] c = i; char[] m = ['x']; c[0] = m; `i[0][0]` would have the same address as `m[0]`. You'd have a `char` that is both immutable and mutable. `scope` is irrelevant, as far as I see. Closing as invalid. Please reopen if I'm missing something. In particular, if you think `scope` is relevant, please describe how it makes the conversion valid.