https://gcc.gnu.org/g:f5b2f72eb0e17345ba4c8203e80fce5baa5f3574
commit r16-6339-gf5b2f72eb0e17345ba4c8203e80fce5baa5f3574 Author: Eric Botcazou <[email protected]> Date: Mon Dec 22 20:50:09 2025 +0100 Ada: Fix ICE in fld_incomplete_type_of when building GtkAda with LTO (2) The change incorrectly resets the alias set of the old pointer/reference, which leads to the miscompilation of a few ACATS tests on some platforms. gcc/ada/ PR ada/123060 * gcc-interface/utils.cc (update_pointer_to): Preserve the alias sets present on the old pointer and old reference, if any. Diff: --- gcc/ada/gcc-interface/utils.cc | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/gcc/ada/gcc-interface/utils.cc b/gcc/ada/gcc-interface/utils.cc index 62587cdb91d0..9176ec29d566 100644 --- a/gcc/ada/gcc-interface/utils.cc +++ b/gcc/ada/gcc-interface/utils.cc @@ -4680,15 +4680,24 @@ update_pointer_to (tree old_type, tree new_type) /* If there is no pointer pointing to NEW_TYPE yet, re-compute the TYPE_CANONICAL of the old pointer but pointing to NEW_TYPE, like build_pointer_type would have done for such a pointer, because we - will propagate it in the adjustment loop below. */ + will propagate it in the adjustment loop below. But make sure to + preserve an alias set already present on the old pointer. */ if (TYPE_STRUCTURAL_EQUALITY_P (new_type)) SET_TYPE_STRUCTURAL_EQUALITY (old_ptr); else if (TYPE_CANONICAL (new_type) != new_type || (TYPE_REF_CAN_ALIAS_ALL (old_ptr) && !lookup_attribute ("may_alias", TYPE_ATTRIBUTES (new_type)))) - TYPE_CANONICAL (old_ptr) - = build_pointer_type (TYPE_CANONICAL (new_type)); + { + alias_set_type set; + if (TYPE_STRUCTURAL_EQUALITY_P (old_ptr)) + set = TYPE_ALIAS_SET (old_ptr); + else + set = TYPE_ALIAS_SET (TYPE_CANONICAL (old_ptr)); + TYPE_CANONICAL (old_ptr) + = build_pointer_type (TYPE_CANONICAL (new_type)); + TYPE_ALIAS_SET (TYPE_CANONICAL (old_ptr)) = set; + } } /* Now adjust them. */ @@ -4716,15 +4725,24 @@ update_pointer_to (tree old_type, tree new_type) /* If there is no reference pointing to NEW_TYPE yet, re-compute the TYPE_CANONICAL of the old reference but pointing to NEW_TYPE, like build_reference_type would have done for such a reference, because - we will propagate it in the adjustment loop below. */ + we will propagate it in the adjustment loop below. But make sure + to preserve an alias set already present on the old reference. */ if (TYPE_STRUCTURAL_EQUALITY_P (new_type)) SET_TYPE_STRUCTURAL_EQUALITY (old_ref); else if (TYPE_CANONICAL (new_type) != new_type || (TYPE_REF_CAN_ALIAS_ALL (old_ref) && !lookup_attribute ("may_alias", TYPE_ATTRIBUTES (new_type)))) - TYPE_CANONICAL (old_ref) - = build_reference_type (TYPE_CANONICAL (new_type)); + { + alias_set_type set; + if (TYPE_STRUCTURAL_EQUALITY_P (old_ref)) + set = TYPE_ALIAS_SET (old_ref); + else + set = TYPE_ALIAS_SET (TYPE_CANONICAL (old_ref)); + TYPE_CANONICAL (old_ref) + = build_reference_type (TYPE_CANONICAL (new_type)); + TYPE_ALIAS_SET (TYPE_CANONICAL (old_ref)) = set; + } } /* Now adjust them. */
