Comment #0 by snarwin+bugzilla — 2024-11-20T16:34:07Z
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.
Comment #1 by nick — 2024-11-21T18:07:12Z
Reduced:
struct S
{
int n;
ref int get() const => n;
}
void main()
{
const S s;
s.get;
}
Comment #2 by nick — 2024-11-21T18:12:36Z
> 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)()
Comment #3 by nick — 2024-11-21T18:16:09Z
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()
Comment #4 by robert.schadek — 2024-12-13T19:38:38Z