digitalmars.D.bugs - [Issue 8001] New: Alias this takes ownership of explicit cast
- d-bugmail puremagic.com (30/30) Apr 29 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8001
- Namespace (16/48) May 02 2012 Workaround:
- Namespace (30/30) May 02 2012 This works fine:
- d-bugmail puremagic.com (11/11) Feb 05 2013 http://d.puremagic.com/issues/show_bug.cgi?id=8001
http://d.puremagic.com/issues/show_bug.cgi?id=8001 Summary: Alias this takes ownership of explicit cast Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: Jesse.K.Phillips+D gmail.com 07:41:14 PDT --- When attempting to downcast a class which uses alias this, the operation fails because the cast is applied to the item aliased. I think the semantics should be to attempt an implicit cast (alias this), then a cast of the top class, afterwards the alias this item can be casted. test.d(3): Error: e2ir: cannot cast a.val of type int to type test.B void main () { A a = new B(); B b = cast(B) a; } class A { int val; alias val this; } class B : A {} -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 29 2012
On Sunday, 29 April 2012 at 14:40:06 UTC, Jesse Phillips wrote:http://d.puremagic.com/issues/show_bug.cgi?id=8001 Summary: Alias this takes ownership of explicit cast Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: Jesse.K.Phillips+D gmail.com <Jesse.K.Phillips+D gmail.com> 2012-04-29 07:41:14 PDT --- When attempting to downcast a class which uses alias this, the operation fails because the cast is applied to the item aliased. I think the semantics should be to attempt an implicit cast (alias this), then a cast of the top class, afterwards the alias this item can be casted. test.d(3): Error: e2ir: cannot cast a.val of type int to type test.B void main () { A a = new B(); B b = cast(B) a; } class A { int val; alias val this; } class B : A {}Workaround: import std.stdio; class A { int val; alias val this; } class B : A { } void main () { A a = new B(); B* b = cast(B*) &a; } But i have no idea how this can work implicit as long as this bug isn't fixed. Maybe it can work with an opCast in B, which cast first to B* and then to B.
May 02 2012
This works fine: [code] import std.stdio; class A { int val; alias val this; T opCast(T : Object)() { return to!(T)(this); } } class B : A { } T to(T : Object, U : Object)(const U obj) { return *(cast(T*) &obj); } void main () { A a = new B(); a.val = 42; writefln("a.val: %d", a.val); B* b = cast(B*) &a; writefln("*b.val: %d", b.val); B b1 = to!(B)(a); writefln("b1.val: %d", b1.val); B b2 = cast(B) a; writefln("b2.val: %d", b2.val); } [/code]
May 02 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8001 Maksim Zholudev <maximzms gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |maximzms gmail.com PST --- May be connected with http://d.puremagic.com/issues/show_bug.cgi?id=6777 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 05 2013