Bug 3180 – Covariance of delegates/function pointers

Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2009-07-15T09:15:00Z
Last change time
2015-06-09T01:31:15Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
rayerd.wiz
Blocks
6352

Comments

Comment #0 by rayerd.wiz — 2009-07-15T09:15:53Z
import std.stdio; class A {} class B : A {} class X { A foo() { return new A; } } class Y : X { B foo() { return new B; } } class V { void foo(B){} } void main() { // Class Covariance (supported already) { X x = new X; Y y = new Y; A r = x.foo(); A s = y.foo(); B t = y.foo(); writeln(r); // A writeln(s); // B writeln(t); // B } // Delegate Covariance { A delegate() f = delegate A() { return new A; }; // Of course, OK. writeln(f()); // A //A delegate() g = delegate B() { return new B; }; // Need support the covariance //writeln(g()); // This should be B. } // Delegate Contravariance { V v = new V; void delegate(B) g = &v.foo; // Of course, OK. //void delegate(A) f = &v.foo; // Need suport the contravariance. } }
Comment #1 by schveiguy — 2009-07-15T18:13:10Z
Your contravariance example is not valid, you cannot call foo(B) with an A. It should be: class V { void foo(A); } ... V v = new v; void delegate(B) g = &v.foo; // contravariance Also this is somewhat of a duplicate of bug 3075. Although you do bring up covariance for delegates, which should be implemented at the same time as contravariance. Sadly, Walter has decided the prior bug is an invalid enhancement request, so most likely nothing will come of this request either. I think the only possible way this may be included is if someone implements it and submits it as a patch to dmd.
Comment #2 by rayerd.wiz — 2009-07-17T16:55:58Z
(In reply to comment #1) > Your contravariance example is not valid, you cannot call foo(B) with an A. > > It should be: > > class V > { > void foo(A); > } > > > ... > > V v = new v; > void delegate(B) g = &v.foo; // contravariance Sorry, it is my mistake. > Also this is somewhat of a duplicate of bug 3075. Although you do bring up > covariance for delegates, which should be implemented at the same time as > contravariance. > > Sadly, Walter has decided the prior bug is an invalid enhancement request, so > most likely nothing will come of this request either. OMG. It is so sad. There are both in C#. > I think the only possible way this may be included is if someone implements it > and submits it as a patch to dmd. I am trying to make some dmd patchs, but it is difficult yet.
Comment #3 by schveiguy — 2011-03-16T10:08:31Z
*** Issue 5742 has been marked as a duplicate of this issue. ***
Comment #4 by yebblies — 2011-06-08T22:48:20Z
*** Issue 3833 has been marked as a duplicate of this issue. ***
Comment #5 by yebblies — 2011-06-08T22:48:58Z
*** Issue 4000 has been marked as a duplicate of this issue. ***
Comment #6 by yebblies — 2011-06-08T22:54:07Z
The enhancement portion of the original report is a dupe of Issue 3075, which has been marked INVALID by Walter. In the comments he states that delegate covariance is supposed to work, so that part of the report is definitely a bug. https://github.com/D-Programming-Language/dmd/pull/96 should fix this report for function pointers.
Comment #7 by yebblies — 2011-06-13T12:16:14Z
*** Issue 4218 has been marked as a duplicate of this issue. ***
Comment #8 by yebblies — 2011-08-18T08:50:28Z
*** Issue 6524 has been marked as a duplicate of this issue. ***
Comment #9 by bugzilla — 2011-09-02T02:38:23Z
Comment #10 by yebblies — 2011-09-06T01:12:49Z
Partial is partial.
Comment #11 by yebblies — 2011-09-06T01:49:34Z
*** Issue 3267 has been marked as a duplicate of this issue. ***
Comment #12 by yebblies — 2011-09-06T02:02:19Z
Part was fixed by https://github.com/D-Programming-Language/dmd/commit/dfb683f63ec89709b0bf2760ef3b2a249ce320eb Raising importance as while not a regression, this fixes one. (bug 6352) Pull for the remaining common type bugs: https://github.com/D-Programming-Language/dmd/pull/368
Comment #13 by yebblies — 2011-09-06T02:03:45Z
Part was fixed by https://github.com/D-Programming-Language/dmd/commit/dfb683f63ec89709b0bf2760ef3b2a249ce320eb Raising importance as while not a regression, this fixes one. (bug 6352) Pull for the remaining common type bugs: https://github.com/D-Programming-Language/dmd/pull/368
Comment #14 by bugzilla — 2011-09-16T23:28:48Z
Comment #15 by rayerd.wiz — 2011-09-17T09:04:50Z
import std.stdio; class Base {} class Derived : Base {} class X { Base foo() { return new Base; } } class Y : X { Derived foo() { return new Derived; } } void main() { // Covariance is good { Base delegate() f = delegate Derived() { return new Derived; }; writefln("delegate convariance is <%s>", f().toString() == "a.Derived" ? "OK" : "NG"); }{ static Derived fp() { return new Derived; } Base function() f = &fp; writefln("function pointer covariance is <%s>", f().toString() == "a.Derived" ? "OK" : "NG"); } // Contravariance is BAD { auto c = new class { void foo(Base){} }; // GOOD void delegate(Base) f = &c.foo; f(new Base); f(new Derived); // BAD void delegate(Derived) g = &c.foo; g(new Derived); } } a.d(33): Error: cannot implicitly convert expression (&c.foo) of type void delegate(Base) to void delegate(Derived) --- Why is "Status" "RESOLVED-FIXED"?
Comment #16 by yebblies — 2011-09-17T19:17:32Z
(In reply to comment #15) > > Why is "Status" "RESOLVED-FIXED"? I assume you're asking why this report was marked as fixed when delegate contravariance hasn't been implemented? See comment #6 and issue 3075, this is covered by another report which has been rejected.