if (kind != E_Exception && Known_Alignment (gnat_entity))
{
gcc_assert (Present (Alignment (gnat_entity)));
+
align = validate_alignment (Alignment (gnat_entity), gnat_entity,
TYPE_ALIGN (gnu_type));
if (Present (Address_Clause (gnat_entity)))
align = 0;
else
- gnu_type
- = maybe_pad_type (gnu_type, NULL_TREE, align, gnat_entity,
- false, false, definition, true);
+ {
+ tree orig_type = gnu_type;
+
+ gnu_type
+ = maybe_pad_type (gnu_type, NULL_TREE, align, gnat_entity,
+ false, false, definition, true);
+
+ /* If a padding record was made, declare it now since it will
+ never be declared otherwise. This is necessary to ensure
+ that its subtrees are properly marked. */
+ if (gnu_type != orig_type && !DECL_P (TYPE_NAME (gnu_type)))
+ create_type_decl (TYPE_NAME (gnu_type), gnu_type, NULL, true,
+ debug_info_p, gnat_entity);
+ }
}
/* If we are defining the object, see if it has a Size and validate it
if (Is_Constr_Subt_For_UN_Aliased (Etype (gnat_entity))
&& Is_Array_Type (Etype (gnat_entity))
&& !type_annotate_only)
- {
- tree gnu_fat
- = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
-
- gnu_type
- = build_unc_object_type_from_ptr (gnu_fat, gnu_type,
- concat_name (gnu_entity_name,
- "UNC"),
- debug_info_p);
- }
+ {
+ tree gnu_fat
+ = TREE_TYPE (gnat_to_gnu_type (Base_Type (Etype (gnat_entity))));
+ gnu_type
+ = build_unc_object_type_from_ptr (gnu_fat, gnu_type,
+ concat_name (gnu_entity_name,
+ "UNC"),
+ debug_info_p);
+ }
#ifdef MINIMUM_ATOMIC_ALIGNMENT
/* If the size is a constant and no alignment is specified, force
--- /dev/null
+-- { dg-do compile }\r
+-- { dg-options "-gnatws" }\r
+\r
+with Array14_Pkg; use Array14_Pkg;\r
+\r
+package body Array14 is\r
+\r
+ package Nested is\r
+\r
+ Length : constant SSE.Storage_Count := Length2;\r
+\r
+ subtype Encoded_Index_Type is SSE.Storage_Count range 1 .. Length;\r
+ subtype Encoded_Type is SSE.Storage_Array (Encoded_Index_Type'Range);\r
+\r
+ procedure Encode (Input : in Integer; Output : out Encoded_Type);\r
+\r
+ end;\r
+\r
+ package body Nested is\r
+\r
+ procedure Encode (Input : in Integer; Output : out Encoded_Type) is\r
+ begin\r
+ Encode2 (Input, Output);\r
+ end;\r
+\r
+ end;\r
+\r
+ procedure Init is\r
+ O : Nested.Encoded_Type;\r
+ for O'Alignment use 4;\r
+ begin\r
+ null;\r
+ end;\r
+\r
+end Array14;\r
--- /dev/null
+with System.Storage_Elements;\r
+\r
+package Array14_Pkg is\r
+\r
+ package SSE renames System.Storage_Elements;\r
+\r
+ function Parity_Byte_Count return SSE.Storage_Count;\r
+\r
+ Length2 : constant SSE.Storage_Count := Parity_Byte_Count;\r
+\r
+ subtype Encoded_Index_Type2 is SSE.Storage_Count range 1 .. Length2;\r
+ subtype Encoded_Type2 is SSE.Storage_Array (Encoded_Index_Type2'Range);\r
+\r
+ procedure Encode2 (Input : in Integer; Output : out Encoded_Type2);\r
+\r
+end Array14_Pkg;\r