First of all, a little quiz
What should the error message be for the following code?
struct Something{}
void main()
{
Something test;
test.get();
}
Well.. it's not what you expect..
onlineapp.d(6): Error: none of the overloads of template `object.get` are callable using argument types `!()(Something)`
/dlang/dmd/linux/bin64/../../src/druntime/import/object.d(3442): Candidates are: `get(K, V)(inout(V[K]) aa, K key, lazy inout(V) defaultValue)`
/dlang/dmd/linux/bin64/../../src/druntime/import/object.d(3449): `get(K, V)(inout(V[K])* aa, K key, lazy inout(V) defaultValue)`
There is the actual error message, surprising right?
Something
is not an associative array, so why AA's functions are in the candidate list?
What Something
has to do with object.get
??
The correct and desirable error message should be:
Error: no property `get` for `test` of type `Something`
Not something confusing and misleading.. that's hard to debug
Do you agree with that?
If you do and want to improve D, then join me and try to fix that behavior!
2 possible solutions that i can think of:
-
functions in
object.d
should be cleaned, everything that has to do withAA
should only work withAA
, and everything that is generic, should be renamed so it doesn't produce conflicts -
DMD should be smarter and the logic for resolving the function should reject these functions, so it can produce the proper error message
I am obviously clueless, so my 1st attempt was to remove the functions plain and simple, it works for me, but that's not the proper solution right..
I suspect that the problem lies here: https://github.com/dlang/dmd/blob/54b6a2f2b0a129fa3c4a994658d9f99e3a6d4ee3/compiler/src/dmd/func.d#L3265-L3485
Join me and let's make D better (join the IRC channel so we can chat about it)