[Issue 17769] dmd accepts conversion from shared(int)* to int* when value comes from method
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Nov 2 09:06:44 UTC 2017
https://issues.dlang.org/show_bug.cgi?id=17769
--- Comment #1 from Lucia Cojocaru <lucia.mcojocaru at gmail.com> ---
The reason for the bug is that there are different overloads in dcast.d for
implicitConvTo for CallExp (int* foo = s.method() falling here) and Expression
(where the other examples in this issue go).
https://github.com/dlang/dmd/blob/master/src/ddmd/dcast.d#L179
Expression: https://github.com/dlang/dmd/blob/master/src/ddmd/dcast.d#L194
CallExp: https://github.com/dlang/dmd/blob/master/src/ddmd/dcast.d#L809
For: int* foo = s.method();
Code goes into visit(CallExp) and calls visit(Expression) which defaults to
NOMATCH(false).
https://github.com/dlang/dmd/blob/master/src/ddmd/dcast.d#L817
On NOMATCH, the checks continue in visit(CallExp) and if nothing is found, it
dafaults to success (true).
https://github.com/dlang/dmd/blob/master/src/ddmd/dcast.d#L940
Everything else hits the default in visit(Expression) which is NOMATCH - hence
the rejecting.
Now I have a fix here disallowing pointer conversions from shared to nonshared
https://github.com/somzzz/dmd/commit/6fdead01822071b464016f1c0313358f40494de2
But DIP29 allows this kind of conversions as long as the pointers are unique.
https://wiki.dlang.org/DIP29
This results in my fix breaking the following compiler tests for DIP29:
https://github.com/dlang/dmd/blob/master/test/runnable/implicit.d#L217
I'm not sure how to check if the pointer is unique. Also, are there any other
subtleties related to DIP29 that these changes could be disregarding?
--
More information about the Digitalmars-d-bugs
mailing list