On Thu, Mar 27, 2025 at 08:02:20AM -0400, Jason Merrill wrote:
> On 3/26/25 9:24 AM, Nathaniel Shead wrote:
> > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
> > 
> > -- >8 --
> > 
> > The ICE in the linked PR is caused because out_ptr_t inherits an ABI tag
> > in a module that it does not in the importing module.  When we try to
> > build a qualified 'const out_ptr_t' during stream-in, we find the
> > existing 'const out_ptr_t' variant type that has been built, but discard
> > it due to having a mismatching attribute list.  This causes us to build
> > a new copy of this variant, and ultimately fail a checking assertion due
> > to this being an identical type with different TYPE_CANONICAL.
> > 
> > This patch adds checking that ABI tags between an imported and existing
> > declaration match, and errors if they are incompatible.  We make use of
> > 'equal_abi_tags' from mangle.cc to determine if we should error; in the
> > case in the PR, because the ABI tag was an implicit tag that doesn't
> > affect name mangling, we don't need to error.  To fix the ICE we ensure
> > that (regardless of whether we errored or not) later processing
> > considers the ABI tags as equivalent.
> > 
> >     PR c++/118920
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * cp-tree.h (equal_abi_tags): Declare.
> >     * mangle.cc (equal_abi_tags): Make external, fix comparison.
> >     (tree_string_cmp): Make internal.
> >     * module.cc (trees_in::check_abi_tags): New function.
> >     (trees_in::decl_value): Use it.
> >     (trees_in::is_matching_decl): Likewise.
> > 
> > @@ -1738,7 +1737,8 @@ equal_abi_tags (tree t1, tree t2)
> >     if (len1 != v2->length())
> >       return false;
> >     for (unsigned i = 0; i < len1; ++i)
> > -    if (tree_string_cmp (v1[i], v2[i]) != 0)
> > +    if (strcmp (TREE_STRING_POINTER (v1[i]),
> > +           TREE_STRING_POINTER (v2[i])) != 0)
> 
> How does this "fix" the comparison?  It looks equivalent to me.
> 
> Jason
> 

I was getting segfaults in my testcases; I think this was unfortunate
conversions to void*, and intended was 'tree_string_cmp(&v1[i], &v2[i])'.
But rather than messing around with that I elected to go with the more
obviously correct approach.

Nathaniel

Reply via email to