https://issues.dlang.org/show_bug.cgi?id=17769
--- Comment #1 from Lucia Cojocaru <lucia.mcojoc...@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? --