On Tue, 2 Apr 2024, Martin Uecker wrote: > [C23]fix aliasing for structures/unions with incomplete types > > When incomplete structure/union types are completed later, compatibility > of struct types that contain pointers to such types changes. When forming > equivalence classes for TYPE_CANONICAL, we therefor need to be conservative > and treat all structs with the same tag which are pointer targets as > equivalent.
I don't see how what it done is actually about "which are pointer targets". > @@ -1355,6 +1356,7 @@ comptypes_internal (const_tree type1, const_tree type2, > /* Do not remove mode information. */ > if (TYPE_MODE (t1) != TYPE_MODE (t2)) > return false; > + data->pointedto = true; > return comptypes_internal (TREE_TYPE (t1), TREE_TYPE (t2), data); This appears to be more like "which are the targets of pointers that *have just been compared in the present comptypes call*". Not which are targets of some other pointers not involved in that call. Maybe some such logic based only on pointers compared in the present call makes sense for some purposes, but it's not clear to me that either this or any similar approach is a good approach for TYPE_CANONICAL - couldn't that mean that two types are considered equivalent for TYPE_CANONICAL at one point in the translation unit, but no longer equivalent at some later point when the comparison takes place in the context of comparing two other pointer types? -- Joseph S. Myers josmy...@redhat.com