diff mbox series

[Ada] Fix uniqueness of address for aliased objects

Message ID 12226560.lY36sMyjSC@polaris
State New
Headers show
Series [Ada] Fix uniqueness of address for aliased objects | expand

Commit Message

Eric Botcazou May 8, 2020, 3:20 p.m. UTC
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.

Tested on x86-64/Linux, applied on the mainline.


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>

	* gnat.dg/addr15.adb: New test.
diff mbox series

Patch

diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index a4053eec839..9c1acd9f23f 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -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;