aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/decl.c15
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/addr15.adb19
4 files changed, 41 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 9644e01..35d1114 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,11 @@
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
with artificial maximally-sized types designed by access types.
* gcc-interface/utils.c (packable_type_hash): New structure.
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index a4053ee..9c1acd9 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 adacf69..8dc87d3 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 0000000..bb79dff
--- /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;