C++ PATCH for c++/88337 - Implement P1327R1: Allow dynamic_cast in constexpr

Jason Merrill jason@redhat.com
Thu Dec 12 19:38:00 GMT 2019


On 12/11/19 5:50 PM, Marek Polacek wrote:
> On Fri, Nov 22, 2019 at 04:11:53PM -0500, Jason Merrill wrote:
>> On 11/8/19 4:24 PM, Marek Polacek wrote:

>>> 2) [class.cdtor] says that when a dynamic_cast is used in a constructor or
>>> destructor and the operand of the dynamic_cast refers to the object under
>>> construction or destruction, this object is considered to be a most derived
>>> object.
>>
>> This means that during the 'tor the vtable pointer refers to the type_info
>> for that class and the offset-to-top is 0.  Can you use that?
> 
> I can't seem to: For e.g.
> 
> struct C : A, C2 { A *c = dynamic_cast<A*>(static_cast<C2*>(this)); };
> 
> the object under construction is C, the call to __dynamic_cast will be
> __dynamic_cast (SAVE_EXPR <&((struct C *) this)->D.2119>, &_ZTI2C2, &_ZTI1A, -2)
> here, OBJ is f.D.2156.D.2119 and ctx->global->ctor_object is f.D.2156.  So OBJ
> refers to the object under construction.
> 
> But I don't see C anywhere; CLASSTYPE_TYPEINFO_VAR of OBJTYPE is _ZTI2C2.
> 
> Am I looking into the wrong place?

Evaluating build_vfield_ref (obj, objtype) will give you the vtable 
pointer, in this case &_ZTV1C + 40.  And then you can get C from 
DECL_CONTEXT (_ZTV1C).

Or get_tinfo_decl_dynamic (obj) will give you the type_info.

Jason



More information about the Gcc-patches mailing list