Bug 24869 – Qualifier dropped from return type when AliasSeq is indexed with template argument

Status
NEW
Severity
enhancement
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2024-11-20T16:34:07Z
Last change time
2024-12-13T19:38:38Z
Assigned to
No Owner
Creator
Paul Backus
Moved to GitHub: dmd#20549 →

Comments

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
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/20549 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB