Fix uniqueness of address for aliased objects

Two aliased objects must have distinct addresses, even if they have
size zero, so we make sure to allocate at least one byte for them.

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Force at
	least the unit size for an aliased object of a constrained nominal
	subtype whose size is variable.
This commit is contained in:
Eric Botcazou 2020-05-08 17:18:20 +02:00
parent bb1ec4773a
commit e34495985e
4 changed files with 41 additions and 3 deletions

View file

@ -1,3 +1,9 @@
2020-05-08 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Force at
least the unit size for an aliased object of a constrained nominal
subtype whose size is variable.
2020-05-08 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Subtype>: Deal

View file

@ -969,10 +969,19 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
align = MINIMUM_ATOMIC_ALIGNMENT;
#endif
/* Make a new type with the desired size and alignment, if needed.
But do not take into account alignment promotions to compute the
size of the object. */
/* Do not take into account aliased adjustments or alignment promotions
to compute the size of the object. */
tree gnu_object_size = gnu_size ? gnu_size : TYPE_SIZE (gnu_type);
/* If the object is aliased, of a constrained nominal subtype and its
size might be zero at run time, we force at least the unit size. */
if (Is_Aliased (gnat_entity)
&& !Is_Constr_Subt_For_UN_Aliased (gnat_type)
&& Is_Array_Type (Underlying_Type (gnat_type))
&& !TREE_CONSTANT (gnu_object_size))
gnu_size = size_binop (MAX_EXPR, gnu_object_size, bitsize_unit_node);
/* Make a new type with the desired size and alignment, if needed. */
if (gnu_size || align > 0)
{
tree orig_type = gnu_type;

View file

@ -1,3 +1,7 @@
2020-05-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/addr15.adb: New test.
2020-05-08 Richard Biener <rguenther@suse.de>
* gnat.dg/opt83.adb: New testcase.

View file

@ -0,0 +1,19 @@
-- { dg-do run }
with System; use System;
procedure Addr15 is
function Get_Bound (Param : Integer) return Integer is (Param);
type Alpha_Typ is array (1 .. Get_Bound (1)) of Integer;
type Beta_Typ is array (1 .. Get_Bound (0)) of Integer;
Alpha : Alpha_Typ;
Beta : aliased Beta_Typ;
begin
if Alpha'Address = Beta'Address then
raise Program_Error;
end if;
end;