As of DMD 2.109.1, the following program fails to compile: --- alias AliasSeq(Args...) = Args; struct S { int n; ref const(AliasSeq!(int)[i]) get(size_t i)() const => n; } void main() { const S s; s.get!0; } --- The error message is: --- bug.d(6): Error: expression `this.n` of type `const(int)` is not implicitly convertible to return type `ref int` bug.d(12): Error: template instance `bug.S.get!0LU` error instantiating --- As show in the error message, the compiler has erroneously determined the return type of `get!0` to be `int`, when it should instead be `const(int)`. The same error also occurs with the immutable, inout, and shared qualifiers.
Reduced: struct S { int n; ref int get() const => n; } void main() { const S s; s.get; }
> ref int get() const => n; Sorry, you're right, ignore comment 1. That should be `ref const(int)`. It's weird as the function prototype type is OK: ref const(AliasSeq!(int)[0]) g() const; pragma(msg, typeof(g)); // const ref const(int)()
OK, making the prototype a template again shows the wrong return type: ref const(AliasSeq!(int)[i]) get(size_t i)() const; pragma(msg, typeof(get!0)); // const ref int()