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