[Issue 210] New: Strange results when covariantly implementing an interface method defined with an interface return type
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jun 19 08:14:36 PDT 2006
http://d.puremagic.com/issues/show_bug.cgi?id=210
Summary: Strange results when covariantly implementing an
interface method defined with an interface return type
Product: D
Version: 0.160
Platform: PC
OS/Version: Windows
Status: NEW
Keywords: wrong-code
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla at digitalmars.com
ReportedBy: smjg at iname.com
OtherBugsDependingO 179
nThis:
This bug carries on where issue 65 left off. That issue covered the case where
the interface-to-class covariance is in a class-to-class override. This one
covers interface-to-class covariance in an interface-to-class override.
This was originally intended to be part of issue 65, but I figured that it
might make more sense to break it off as a separate issue.
Testcases, based on issue 179 comment 1:
----------
import std.stdio;
interface Father {
Father test();
void showData();
}
class Child : Father {
int data;
this(int d) { data = d; }
Child test() {
writefln("in CovFunc Test");
return new Child(69);
}
void showData() {
writefln("Child: %d", data);
}
}
void icov2test() {
Child aChild = new Child(42);
aChild.showData();
Father childsDad = aChild;
childsDad.showData();
Father dadTest = childsDad.test;
writefln("FCALL dadTest.showData");
dadTest.showData();
writefln("FCALL dadTest.test");
dadTest.test();
writefln("FCALL (cast(Child) dadTest).showData");
(cast(Child) dadTest).showData();
}
----------
import std.stdio;
interface IFoo {
}
interface ICov {
IFoo covfunc();
}
class Child : ICov, IFoo {
Child covfunc() {
writefln("in CovFunc Test");
return new Child();
}
}
void icov3() {
ICov icov = new Child();
IFoo ifoo = icov.covfunc();
writefln(ifoo.classinfo.name); // Segfault or prints garbage
writefln((cast(Object) ifoo)); // Segfault or prints garbage
}
----------
import std.stdio;
interface IFoo {
IFoo covfunc();
}
class Child : IFoo {
Child covfunc() {
writefln("in CovFunc Test");
return new Child();
}
}
void icov3() {
IFoo icov = new Child();
IFoo ifoo = icov.covfunc();
writefln(ifoo.classinfo.name);
writefln((cast(Object) ifoo));
}
----------
There are other cases to test, namely those involving interface-to-interface
covariance || an interface-to-interface override. But getting the above tests
working would be a start.
--
More information about the Digitalmars-d-bugs
mailing list