[gcc/devel/gccgo] Fix uniqueness of address for aliased objects

Ian Lance Taylor ian@gcc.gnu.org
Sun Jul 12 18:00:28 GMT 2020


https://gcc.gnu.org/g:e34495985e49545c468e664ee10bd0e66c7395bf

commit e34495985e49545c468e664ee10bd0e66c7395bf
Author: Eric Botcazou <ebotcazou@gcc.gnu.org>
Date:   Fri May 8 17:18:20 2020 +0200

    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.

Diff:
---
 gcc/ada/ChangeLog                |  6 ++++++
 gcc/ada/gcc-interface/decl.c     | 15 ++++++++++++---
 gcc/testsuite/ChangeLog          |  4 ++++
 gcc/testsuite/gnat.dg/addr15.adb | 19 +++++++++++++++++++
 4 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 9644e018f3e..35d111401e2 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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
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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index adacf69b027..8dc87d3948d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gnat.dg/addr15.adb b/gcc/testsuite/gnat.dg/addr15.adb
new file mode 100644
index 00000000000..bb79dff862f
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/addr15.adb
@@ -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;


More information about the Gcc-cvs mailing list