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 }
`i` isn't shared, but the method of the interface requires sharedness. Thus, the error is legit, imho. Am I missing something?
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.
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