Jump to page: 1 2
Thread overview
[Issue 7375] New: Regression(2.057): Invalid downcast permitted with derived/aliased template classes
Jan 27, 2012
Nick Sabalausky
Jan 27, 2012
Nick Sabalausky
Jan 30, 2012
Walter Bright
Jan 30, 2012
Walter Bright
Jan 30, 2012
Walter Bright
Jan 30, 2012
Walter Bright
Jan 30, 2012
yebblies
Jan 30, 2012
dawg@dawgfoto.de
Jan 30, 2012
dawg@dawgfoto.de
Jan 30, 2012
Walter Bright
Jan 30, 2012
Walter Bright
January 27, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375

           Summary: Regression(2.057): Invalid downcast permitted with
                    derived/aliased template classes
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: wrong-code
          Severity: regression
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: cbkbbejeap@mailinator.com


--- Comment #0 from Nick Sabalausky <cbkbbejeap@mailinator.com> 2012-01-27 00:22:38 PST ---
a.d:
----------------
import b;

void main(string[] args)
{
    auto foo = getEleven();
    //auto dummy = cast(Derived!11)foo;
    assert(cast(Derived!22)foo is null);
}

alias DerivedAlias!22 X;
----------------

b.d:
----------------
module b;

Base getEleven()
{
    Base foo = new MoreDerived!11(null);
    return foo;
}

class Base
{
    Base a;
    this(Base a)
    {
        this.a = a;
    }
}

class Derived(int i) : Base
{
    this(Base a)
    {
        super(a);
    }
}

class MoreDerived(int i) : Derived!i
{
    this(Base a)
    {
        super(a);
    }
}

template DerivedAlias(int i)
{
    alias Derived!i DerivedAlias;
}
----------------

On 2.057, the assert fails. (It's fine on 2.056.)

If you uncomment the "dummy" line, the problem goes away (merely creating an alias for Derived!11 does not work). However, that's *not* a general workaround because in order to test what the runtime type is, you have to *already* know *all* the types it might be and attempt to downcast to each of them.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 27, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375



--- Comment #1 from Nick Sabalausky <cbkbbejeap@mailinator.com> 2012-01-27 00:26:47 PST ---
Sorry, I forgot to finish minimizing "b.d". The properly minimized "b.d" is:

--------------------
module b;

Base getEleven()
{
    Base foo = new MoreDerived!11();
    return foo;
}

class Base {}
class Derived(int i) : Base {}
class MoreDerived(int i) : Derived!i {}

template DerivedAlias(int i)
{
    alias Derived!i DerivedAlias;
}
--------------------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla@digitalmars.com


--- Comment #2 from Walter Bright <bugzilla@digitalmars.com> 2012-01-29 22:16:19 PST ---
A one file version:
-------------------
class A {}
class B(int i) : A {}
class C(int i) : B!i {}

template DerivedAlias(int i)
{
    alias B!i DerivedAlias;
}

alias DerivedAlias!22 X;

void main(string[] args)
{
    A foo = new C!11();
    //auto dummy = cast(B!11)foo;
    assert(cast(B!22)foo is null);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375



--- Comment #3 from Walter Bright <bugzilla@digitalmars.com> 2012-01-30 01:20:02 PST ---
The failure definitely happened between 2.056 and 2.057. Anyone care to run the git binary diff thing?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375



--- Comment #4 from Walter Bright <bugzilla@digitalmars.com> 2012-01-30 02:02:19 PST ---
Auch, I found it. In druntime/src/rt/cast_.d, the addition of a name compare saying the classes are the same in _d_isbaseof and _d_isbaseof2.

Not sure what the right fix is.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375



--- Comment #5 from Walter Bright <bugzilla@digitalmars.com> 2012-01-30 02:04:29 PST ---
The culprit:

https://github.com/D-Programming-Language/druntime/commit/5d21d47b5adda97759d15ec0139c0d5fac646971

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375


yebblies <yebblies@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |yebblies@gmail.com


--- Comment #6 from yebblies <yebblies@gmail.com> 2012-01-31 03:14:09 EST ---
I suspected is was that commit. (I remember seeing it when it was committed) Sorry I didn't get around to looking into it earlier.

I think the solution is to do a compare on the full mangled name of the class, but  I can't see anywhere it's exposed in the classinfo so it would need to be added.

This should probably be delayed until after the release and the commit reverted.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375


dawg@dawgfoto.de changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dawg@dawgfoto.de


--- Comment #7 from dawg@dawgfoto.de 2012-01-30 09:39:05 PST ---
This was introduced by pull #92 https://github.com/D-Programming-Language/druntime/commits/29f33bfdc0d36484e77ae8f369656720319f22e3.

This added classinfo.name comparison while searching base classes.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375



--- Comment #8 from dawg@dawgfoto.de 2012-01-30 10:01:25 PST ---
https://github.com/D-Programming-Language/druntime/pull/142

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 30, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7375



--- Comment #9 from github-bugzilla@puremagic.com 2012-01-30 11:12:29 PST ---
Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/3a6c3629f3185c2d65354d1f04c500eb737d49d9
fix Issue 7375 - Regression(2.057): Invalid downcast permitted with
derived/aliased template classes

https://github.com/D-Programming-Language/dmd/commit/667ff95c935bc1cf743517b69d2dc421e43f9a51
fix Issue 7375 - Regression(2.057): Invalid downcast permitted with
derived/aliased template classes

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2