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