]> gcc.gnu.org Git - gcc.git/commitdiff
decl.c (gnat_to_gnu_component_type): Force at least unit size for the component size...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 2 Oct 2009 20:03:16 +0000 (20:03 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 2 Oct 2009 20:03:16 +0000 (20:03 +0000)
* gcc-interface/decl.c (gnat_to_gnu_component_type): Force at least
unit size for the component size of an array with aliased components.
(maybe_pad_type): Do not warn for MAX_EXPR.

From-SVN: r152417

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/array11.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/array12.adb [new file with mode: 0644]

index f0577bd9e26aca8a4fc02eb92a050302258e80bc..967e4f034969c2e0f37afafda6379d98dabcc825 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_component_type): Force at least
+       unit size for the component size of an array with aliased components.
+       (maybe_pad_type): Do not warn for MAX_EXPR.
+
 2009-09-29  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Factor out
index 3fb7c807614f9533de46a97c9776fb055269077d..22ee89e6675b768a3b906f3a423d4be6e7de79ce 100644 (file)
@@ -4990,6 +4990,17 @@ gnat_to_gnu_component_type (Entity_Id gnat_array, bool definition,
                     Is_Bit_Packed_Array (gnat_array) ? TYPE_DECL : VAR_DECL,
                     true, Has_Component_Size_Clause (gnat_array));
 
+  /* If the array has aliased components and the component size can be zero,
+     force at least unit size to ensure that the components have distinct
+     addresses.  */
+  if (!gnu_comp_size
+      && Has_Aliased_Components (gnat_array)
+      && (integer_zerop (TYPE_SIZE (gnu_type))
+         || (TREE_CODE (gnu_type) == ARRAY_TYPE
+             && !TREE_CONSTANT (TYPE_SIZE (gnu_type)))))
+    gnu_comp_size
+      = size_binop (MAX_EXPR, TYPE_SIZE (gnu_type), bitsize_unit_node);
+
   /* If the component type is a RECORD_TYPE that has a self-referential size,
      then use the maximum size for the component size.  */
   if (!gnu_comp_size
@@ -6210,6 +6221,7 @@ maybe_pad_type (tree type, tree size, unsigned int align,
 
   if (Present (gnat_entity)
       && size
+      && TREE_CODE (size) != MAX_EXPR
       && !operand_equal_p (size, orig_size, 0)
       && !(TREE_CODE (size) == INTEGER_CST
           && TREE_CODE (orig_size) == INTEGER_CST
index a7739b8ec891c7be3ef96fbeb15671422ddfbb51..f2dba40ab97bf4ddffdeda50f751e7099d8eb0b8 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/array11.adb: New test.
+       * gnat.dg/array12.adb: Likewise.
+
 2009-10-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/array10.adb: New test.
diff --git a/gcc/testsuite/gnat.dg/array11.adb b/gcc/testsuite/gnat.dg/array11.adb
new file mode 100644 (file)
index 0000000..0a7edcf
--- /dev/null
@@ -0,0 +1,16 @@
+-- { dg-do compile }
+
+procedure Array11 is
+
+  type Rec is null record;
+  type Ptr is access all Rec;
+
+  type Arr1 is array (1..8) of aliased Rec; -- { dg-warning "padded" }
+  type Arr2 is array (Long_Integer) of aliased Rec; -- { dg-warning "padded" }
+
+  A1 : Arr1;
+  A2 : Arr2; -- { dg-warning "Storage_Error will be raised" }
+
+begin
+  null;
+end;
diff --git a/gcc/testsuite/gnat.dg/array12.adb b/gcc/testsuite/gnat.dg/array12.adb
new file mode 100644 (file)
index 0000000..3748d5e
--- /dev/null
@@ -0,0 +1,20 @@
+-- { dg-do run }
+
+procedure Array12 is
+
+  function N return Integer is
+  begin
+    return 0;
+  end;
+
+  subtype Element is String (1 .. N);
+  type Ptr is access all Element;
+  type Vector is array (Positive range <>) of aliased Element;
+
+  V : Vector (1..2);
+
+begin
+  if Ptr'(V(1)'Access) = V(2)'Access then
+    raise Program_Error;
+  end if;
+end;
This page took 0.111836 seconds and 5 git commands to generate.