decl.c (is_variable_size): Do not unconditionally return false on non-strict alignmen...
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 6 Apr 2008 13:38:41 +0000 (13:38 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 6 Apr 2008 13:38:41 +0000 (13:38 +0000)
* decl.c (is_variable_size): Do not unconditionally return false
on non-strict alignment platforms.

From-SVN: r133961

gcc/ada/ChangeLog
gcc/ada/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/pack5.adb [new file with mode: 0644]

index a6f14035db3fff0e11237d64961e8454c07a6ac4..4ed6a527de2228d1c38b56236f85931ee1266ad4 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * decl.c (is_variable_size): Do not unconditionally return false
+       on non-strict alignment platforms.
+
 2008-04-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * decl.c (rest_of_type_decl_compilation_no_defer): New local function
index e31b52528ed86c5a4cfb28e3a666eccaaacbd5c6..bda144e38792661b888dd828f455e98f806850e1 100644 (file)
@@ -6103,18 +6103,17 @@ is_variable_size (tree type)
 {
   tree field;
 
-  /* We need not be concerned about this at all if we don't have
-     strict alignment.  */
-  if (!STRICT_ALIGNMENT)
-    return false;
-  else if (!TREE_CONSTANT (TYPE_SIZE (type)))
+  if (!TREE_CONSTANT (TYPE_SIZE (type)))
     return true;
-  else if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type)
-          && !TREE_CONSTANT (DECL_SIZE (TYPE_FIELDS (type))))
+
+  if (TREE_CODE (type) == RECORD_TYPE
+      && TYPE_IS_PADDING_P (type)
+      && !TREE_CONSTANT (DECL_SIZE (TYPE_FIELDS (type))))
     return true;
-  else if (TREE_CODE (type) != RECORD_TYPE
-          && TREE_CODE (type) != UNION_TYPE
-          && TREE_CODE (type) != QUAL_UNION_TYPE)
+
+  if (TREE_CODE (type) != RECORD_TYPE
+      && TREE_CODE (type) != UNION_TYPE
+      && TREE_CODE (type) != QUAL_UNION_TYPE)
     return false;
 
   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
index ee449b600e33d6927c7d367f0224274499fd167f..9fc756e01284d29bebd16693b93c41ade66ac1e9 100644 (file)
@@ -1,3 +1,7 @@
+2008-04-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/pack5.adb: New test.
+
 2008-04-06  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/12329
diff --git a/gcc/testsuite/gnat.dg/pack5.adb b/gcc/testsuite/gnat.dg/pack5.adb
new file mode 100644 (file)
index 0000000..12bea11
--- /dev/null
@@ -0,0 +1,32 @@
+-- { dg-do compile }
+
+procedure Pack5 is
+
+  type Kind is (v1, v2, v3);
+
+  type Error (k : Kind := Kind'First) is record
+    case k is
+    when v1 =>
+      null;
+    when v2 =>
+      null;
+    when Others =>
+      B : Boolean;
+    end case;
+  end record;
+  pragma Pack (Error);
+  for Error'Size use 16;
+
+  No_Error: constant Error := (k => v2);
+
+  type R (B : Boolean) is record
+    E : Error;
+  end record;
+  pragma Pack(R);
+  type Ptr is access R;
+
+  C : Ptr := new R (True);
+
+begin
+  C.E := No_Error;
+end;