← Back to index
|
Original Bugzilla link
Bug 17769 – dmd accepts conversion from shared(int)* to int* when value comes from method
Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2017-08-20T18:09:10Z
Last change time
2024-12-13T18:54:13Z
Keywords
accepts-invalid
Assigned to
Lucia Cojocaru
Creator
ag0aep6g
Moved to GitHub: dmd#19306 →
Comments
Comment #0
by ag0aep6g — 2017-08-20T18:09:10Z
---- struct S() { shared(int)* method() { return ptr; } shared(int)* ptr; } void main() { S!() s; int* foo = s.method(); /* accepted; should be rejected */ } ---- These variations are correctly rejected: ---- auto foo = s.method(); int* bar = foo; // rejected as expected int* baz = s.ptr; // ditto ----
Comment #1
by lucia.mcojocaru — 2017-11-02T09:06:44Z
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?
Comment #2
by robert.schadek — 2024-12-13T18:54:13Z
THIS ISSUE HAS BEEN MOVED TO GITHUB
https://github.com/dlang/dmd/issues/19306
DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB