On Wed, Nov 26, 2025 at 09:49:45AM +0100, Richard Biener wrote:
> > --- gcc/cp/cp-objcp-common.cc.jj    2025-10-09 22:41:19.871273246 +0200
> > +++ gcc/cp/cp-objcp-common.cc       2025-11-25 12:37:38.251339146 +0100
> > @@ -181,10 +181,10 @@ cxx_get_alias_set (tree t)
> >      return get_alias_set (TYPE_CONTEXT (t));
> >  
> >    /* Punt on PMFs until we canonicalize functions properly.  */
> > -  if (TYPE_PTRMEMFUNC_P (t)
> > -      || (INDIRECT_TYPE_P (t)
> > -     && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))))
> > +  if (TYPE_PTRMEMFUNC_P (t))
> >      return 0;
> > +  if (INDIRECT_TYPE_P (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
> > +    return get_alias_set (ptr_type_node);
> 
> I think we'd get the same effect from alias.cc itself iff 
> TYPE_PTRMEMFUNC_P were TYPE_STRUCTURAL_EQUALITY_P.  In particular
> I'll not that a PMF ** would not end up invoking the langhook for
> PMF *.  While the pointer code in get_alias_set eventually
> looks at the "base", it does not re-query the frontend about it,
> but only special-case
> 
>       if (TREE_CODE (p) == VOID_TYPE || TYPE_STRUCTURAL_EQUALITY_P (p))
>         set = get_alias_set (ptr_type_node);
> 
> so given it seems we don't exactly know what goes wrong I fear while
> the fix makes sense, it's not complete?  Unless TYPE_PTRMEMFUNC_P
> already is TYPE_STRUCTURAL_EQUALITY_P, in which case all the
> special-casing could go?

It is TYPE_STRUCTURAL_EQUALITY_P only sometimes, the FE relies on
TYPE_CANONICAL on it otherwise.  It is created with
12823     if (TYPE_STRUCTURAL_EQUALITY_P (type))
12824       SET_TYPE_STRUCTURAL_EQUALITY (t);
12825     else if (TYPE_CANONICAL (type) != type)
12826       TYPE_CANONICAL (t) = build_ptrmemfunc_type (TYPE_CANONICAL (type));
and so depends on whether its TYPE_PTRMEMFUNC_TYPE is
TYPE_STRUCTURAL_EQUALITY_P or not.

        Jakub

Reply via email to