Bug 18138 – non-shared method overload not accessible through interface

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2017-12-28T11:23:28Z
Last change time
2024-12-13T18:55:51Z
Assigned to
No Owner
Creator
Remi Thebault
Moved to GitHub: dmd#19356 →

Comments

Comment #0 by remi.thebault — 2017-12-28T11:23:28Z
Consider the following program and error. The compiler should not complain. If ITest is merged with IAtomicTest, the error is gone. At run-time, methods are correctly dispatched. interface ITest { void method(); } interface IAtomicTest : ITest { shared void method(); } class AtomicTest : IAtomicTest { int member; override final shared void method() { import core.atomic : atomicOp; import std.stdio : writeln; auto m = atomicOp!"+="(member, 1); writeln("atomic: ", m); } override final void method() { import std.stdio : writeln; member += 1; writeln("non-atomic: ", member); } } void main() { auto ao = new shared(AtomicTest); auto o = new AtomicTest; ao.method(); // fine o.method(); // fine auto ai = cast(shared(IAtomicTest))ao; auto i = cast(IAtomicTest)o; ai.method(); // fine (cast(ITest)i).method(); // fine i.method(); // Error: shared method app.IAtomicTest.method is not callable using a non-shared object }
Comment #1 by greeenify — 2017-12-28T13:23:37Z
`i` isn't shared, but the method of the interface requires sharedness. Thus, the error is legit, imho. Am I missing something?
Comment #2 by remi.thebault — 2017-12-28T14:20:37Z
yes, but the ITest interface has a non-shared method, which is overloaded in IAtomicTest (IAtomicTest extends ITest), so the non-shared method should be visible too.
Comment #3 by robert.schadek — 2024-12-13T18:55:51Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19356 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB