On Tue, Jun 24, 2025 at 10:33:01PM +0200, Jakub Jelinek wrote:
> On Tue, Jun 24, 2025 at 08:25:33PM +0200, Jakub Jelinek wrote:
> > > > know enough about dynamic_cast and cxx_eval_dynamic_cast_fn
> > > > to figure out what needs to change there.  It is hint -2 that
> > > > fails, not hint -1.
> > > 
> > > Yes, this is a -2 case because C does not derive from B.
> > > 
> > > How does cxx_eval_dynamic_cast_fn fail in this case?  From looking at the
> > > function it seems like it ought to work.
> > 
> > I'll study it in detail tomorrow.
> 
> Actually, I see the reason now.
> get_component_path is called with
> a.D.2692, A, NULL
> where a.D.2692 has B type.
> And the reason why it fails is
> 2538            /* We need to check that the component we're accessing is in 
> fact
> 2539               accessible.  */
> 2540            if (TREE_PRIVATE (TREE_OPERAND (path, 1))
> 2541                || TREE_PROTECTED (TREE_OPERAND (path, 1)))
> 2542              return error_mark_node;
> The D.2692 FIELD_DECL has been created by build_base_field_1
> called from build_base_field from layout_virtual_bases and that one calls it
> with
> 6753        if (!BINFO_PRIMARY_P (vbase))
> 6754          {
> 6755            /* This virtual base is not a primary base of any class in the
> 6756               hierarchy, so we have to add space for it.  */
> 6757            next_field = build_base_field (rli, vbase,
> 6758                                           access_private_node,
> 6759                                           offsets, next_field);
> 6760          }
> access_private_node forces TREE_PRIVATE on the FIELD_DECL and so it doesn't
> reflect whether the base in question was private/protected or public.
> struct A has also D.2689 FIELD_DECL with C type and that one is the primary
> base, neither TREE_PRIVATE nor TREE_PROTECTED.

So, shall I e.g. for the if (TREE_PRIVATE case if the outer type has
CLASSTYPE_VBASECLASSES walk the
for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase))
if (BINFO_VIRTUAL_P (vbase) && !BINFO_PRIMARY_P (vbase))
and in that case try to compare byte_position (TREE_OPERAND (path, 1))
against BINFO_OFFSET (vbase) and if it matches (plus perhaps some type
check?) then decide based on BINFO_BASE_ACCESS or something like that
whether it was a private/protected vs. public virtual base?

        Jakub

Reply via email to