This is a possible optimization for the common interface casts. But it requires a breaking of not well known small assumption.
In git-head (f78b25c9fb00bf024cd1d6e394f696bba4f2187b), issue 1747 and issue 2013 has been fixed properly. With the latest dmd:
interface IA {}
interface IB {}
interface IC : IB, IA {}
interface ID : IC {}
interface IE : IC {}
// C instance layout with -m32:
// ofs: 8 12 16 20
// IB, IA IB, IA
// IC IC
class C : ID, IE
{
}
void main()
{
C c = new C();
ID id = c; // class to base interface: static cast
IE ie = c; // class to base interface: static cast
IC ic1 = id; // intreface to 1st base interface: static cast
IC ic2 = ie; // class to base interface: static cast
assert(ic1 !is ic2);
// ic1 and ic2 are not identical, but they points same vtbl.
// therefore any member function call via them will work.
IA ia1 = ic1; // interface to 2nd base interface: dynamic cast!
IA ia2 = ic2; // interface to 2nd base interface: dynamic cast!
assert(ia1 is ia2);
// By the dynamic cast, two IA will be identical.
// However, like to the ic case, it's inherently unnecessary.
}
If we can agree to allow to fail the last assert(ia1 is ia2), we can remove costly dynamic cast from all class/interface upcasts.
Comment #1 by robert.schadek — 2024-12-13T18:43:48Z