aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-06-21 00:50:54 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2022-07-13 10:01:19 +0000
commit6071ef0bed2081dd1ecd89299127ae07077df1f3 (patch)
tree8ec4553a66b9ce8337def6aa714e15e1515fd286
parent84d3047b14b85b680ee3c88a9a214bbea9c260fc (diff)
downloadgcc-6071ef0bed2081dd1ecd89299127ae07077df1f3.zip
gcc-6071ef0bed2081dd1ecd89299127ae07077df1f3.tar.gz
gcc-6071ef0bed2081dd1ecd89299127ae07077df1f3.tar.bz2
[Ada] Fix wrong access check with access-to-unconstrained-array
The current implementation may create dangling references from a superset of the alias set of the dummy pointer-to-array type when it exists. gcc/ada/ * gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Array_Type>: Save and restore the alias set of the dummy pointer-to-array type.
-rw-r--r--gcc/ada/gcc-interface/decl.cc21
1 files changed, 13 insertions, 8 deletions
diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc
index 99277f0..2510ee8 100644
--- a/gcc/ada/gcc-interface/decl.cc
+++ b/gcc/ada/gcc-interface/decl.cc
@@ -2102,15 +2102,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
const bool convention_fortran_p
= (Convention (gnat_entity) == Convention_Fortran);
const int ndim = Number_Dimensions (gnat_entity);
- tree gnu_template_type;
- tree gnu_ptr_template;
- tree gnu_template_reference, gnu_template_fields, gnu_fat_type;
+ tree gnu_fat_type, gnu_template_type, gnu_ptr_template;
+ tree gnu_template_reference, gnu_template_fields;
tree *gnu_index_types = XALLOCAVEC (tree, ndim);
tree *gnu_temp_fields = XALLOCAVEC (tree, ndim);
- tree gnu_max_size = size_one_node, tem, obj;
+ tree gnu_max_size = size_one_node;
+ tree comp_type, tem, obj;
Entity_Id gnat_index;
+ alias_set_type ptr_set = -1;
int index;
- tree comp_type;
/* Create the type for the component now, as it simplifies breaking
type reference loops. */
@@ -2181,6 +2181,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
if (COMPLETE_TYPE_P (gnu_fat_type))
{
tem = TYPE_FIELDS (gnu_fat_type);
+ if (TYPE_ALIAS_SET_KNOWN_P (TREE_TYPE (tem)))
+ ptr_set = TYPE_ALIAS_SET (TREE_TYPE (tem));
TREE_TYPE (tem) = ptr_type_node;
TREE_TYPE (DECL_CHAIN (tem)) = gnu_ptr_template;
TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (gnu_fat_type)) = 0;
@@ -2389,7 +2391,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
tem = change_qualified_type (tem, TYPE_QUAL_VOLATILE);
/* Adjust the type of the pointer-to-array field of the fat pointer
- and record the aliasing relationships if necessary. If this is
+ and preserve its existing alias set, if any. Note that calling
+ again record_component_aliases on the fat pointer is not enough
+ because this may leave dangling references to the existing alias
+ set from types containing a fat pointer component. If this is
a packed type implemented specially, then use a ref-all pointer
type since the implementation type may vary between constrained
subtypes and unconstrained base type. */
@@ -2398,8 +2403,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
= build_pointer_type_for_mode (tem, ptr_mode, true);
else
TREE_TYPE (TYPE_FIELDS (gnu_fat_type)) = build_pointer_type (tem);
- if (TYPE_ALIAS_SET_KNOWN_P (gnu_fat_type))
- record_component_aliases (gnu_fat_type);
+ if (ptr_set != -1)
+ TYPE_ALIAS_SET (TREE_TYPE (TYPE_FIELDS (gnu_fat_type))) = ptr_set;
/* If the maximum size doesn't overflow, use it. */
if (gnu_max_size