<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><font face="arial, helvetica, sans-serif">Hello,</font></div><div><font face="arial, helvetica, sans-serif">I've noticed that Clang generates typeinfo for non-polymorphic types with virtual inheritance. Why is that?</font></div><div dir="ltr"><font face="arial, helvetica, sans-serif"><br></font><div><font face="arial, helvetica, sans-serif">My understanding is that RTTI should not be provided for non-polymorphic types.</font></div><div><font face="arial, helvetica, sans-serif">Here is what I've read in ABI:</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif"><a href="https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable">https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable</a><br></font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif"><a name="q1" style="color:rgb(0,0,0)">The <i>typeinfo pointer</i> points to the typeinfo object used for RTTI. It is always present. All entries in each of the virtual tables for a given class must point to the same typeinfo object. A correct implementation of typeinfo equality is to check pointer equality, except for pointers (directly or indirectly) to incomplete types. <b>The typeinfo pointer is a valid pointer for polymorphic classes, i.e. those with virtual functions, and is zero for non-polymorphic classes.</b></a><br></font></div><div><a name="q1" style="color:rgb(0,0,0)"><b><font face="arial, helvetica, sans-serif"><br></font></b></a></div><div><a name="q1" style="color:rgb(0,0,0)"><font face="arial, helvetica, sans-serif">So I've expected 0 value of typeinfo for classes without virtual functions.</font></a></div><div><font face="arial, helvetica, sans-serif"> In practice however both GCC and Clang generate typeinfo. Why is that?</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Example:</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif"><div>struct VirtualBase {};<br></div><div><br></div><div>struct Derived0 : virtual VirtualBase{};</div><div>struct Derived1 : virtual VirtualBase{};</div><div>struct MostDerived : Derived0, Derived1 {};</div><div><br></div><div>int main()</div><div>{</div><div>    MostDerived md;</div><div>    uintptr_t **vtable = (uintptr_t **)&md;</div><div>    type_info * tinfo = (type_info *)(*vtable)[-1];</div><div>    cout << tinfo->name() << "\n";</div><div>    return 0;</div><div>}</div><div><br></div><div>Output:</div><div>11MostDerived<br></div><div><br></div><div>Thanks,</div><div>Roman</div><div><br></div></font></div></div></div></div></div>