Bug 17766 – Wrong choice of generic mutable/const/immutable methods

Status
NEW
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2017-08-20T05:19:27Z
Last change time
2024-12-13T18:54:09Z
Keywords
wrong-code
Assigned to
No Owner
Creator
Илья Ярошенко
Moved to GitHub: dmd#19304 →

Comments

Comment #0 by ilyayaroshenko — 2017-08-20T05:19:27Z
static struct Foo() { char opIndex(Indexes...)(Indexes indexes) immutable { return 'i'; } char opIndex()() const { return 'c'; } char opIndex(Indexes...)(Indexes indexes) { return 'm'; } } pragma(msg, Foo!()()[]); pragma(msg, (cast(const) Foo!()())[]); pragma(msg, (cast(immutable) Foo!()())[]); Prints 'c' 'c' 'c' But shuold be 'm' 'c' 'i' Type qualifier should have priority.
Comment #1 by alexandru.ermicioi — 2018-10-22T19:11:27Z
This is not the only case, here is another case of wrong selection: ---------------------- class Mquartz(T, Z) { Z pass(T component) const { "Mutable pass".writeln; return component.z; } const(Z) pass(const T component) const { "Const pass".writeln; return component.z; } const(Z) pass(immutable T component) const { "Immutable pass".writeln; return component.z; } const(Z) pass(inout T component) const { "Inout pass".writeln; return component.z; } } struct V { int z; } void main() { auto m = new Mquartz!(V, typeof(V.z)); // V v = V(21); // writeln(m.pass(v)); writeln(m.pass(V(20))); writeln(m.pass(const(V)(20))); writeln(m.pass(immutable(V)(20))); writeln(m.pass(inout(V)(20))); } ------------------------- Current logic will select only const version with const argument instead of selecting right ones: ------------------------- Const pass 20 Const pass 20 Const pass 20 Const pass 20 ------------------------- The overload selection logic works as expected only if m is const, then response will as expected: ------------------------- Mutable pass 20 Const pass 20 Immutable pass 20 Inout pass 20 -------------------------
Comment #2 by robert.schadek — 2024-12-13T18:54:09Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19304 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB