From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1914) id CF267382A2F4; Wed, 13 Jul 2022 10:04:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CF267382A2F4 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Pierre-Marie de Rodat To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-1671] [Ada] Fix wrong access check with access-to-unconstrained-array X-Act-Checkin: gcc X-Git-Author: Eric Botcazou X-Git-Refname: refs/heads/master X-Git-Oldrev: 84d3047b14b85b680ee3c88a9a214bbea9c260fc X-Git-Newrev: 6071ef0bed2081dd1ecd89299127ae07077df1f3 Message-Id: <20220713100402.CF267382A2F4@sourceware.org> Date: Wed, 13 Jul 2022 10:04:02 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Jul 2022 10:04:02 -0000 https://gcc.gnu.org/g:6071ef0bed2081dd1ecd89299127ae07077df1f3 commit r13-1671-g6071ef0bed2081dd1ecd89299127ae07077df1f3 Author: Eric Botcazou Date: Tue Jun 21 00:50:54 2022 +0200 [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) : Save and restore the alias set of the dummy pointer-to-array type. Diff: --- gcc/ada/gcc-interface/decl.cc | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc index 99277f07306..2510ee8bc67 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