+2010-05-08 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/gigi.h (build_unc_object_type): Add DEBUG_INFO_P param.
+ (build_unc_object_type_from_ptr): Likewise.
+ * gcc-interface/utils.c (build_unc_object_type): Add DEBUG_INFO_P param
+ and pass it to create_type_decl. Declare the type. Simplify.
+ (build_unc_object_type_from_ptr): Add DEBUG_INFO_P parameter and pass
+ it to build_unc_object_type.
+ * gcc-interface/decl.c (gnat_to_gnu_entity): Adjust to above change.
+ * gcc-interface/trans.c (Attribute_to_gnu): Likewise.
+ (gnat_to_gnu): Likewise.
+ * gcc-interface/utils2.c (build_allocator): Likewise.
+
2010-05-07 Eric Botcazou <ebotcazou@adacore.com>
PR 40989
gnu_type
= build_unc_object_type_from_ptr (gnu_fat, gnu_type,
concat_name (gnu_entity_name,
- "UNC"));
+ "UNC"),
+ debug_info_p);
}
#ifdef MINIMUM_ATOMIC_ALIGNMENT
a record type for the object and its template with the fields
shifted to have the template at a negative offset. */
tem = build_unc_object_type (gnu_template_type, tem,
- create_concat_name (gnat_name, "XUT"));
+ create_concat_name (gnat_name, "XUT"),
+ debug_info_p);
shift_unc_components_for_thin_pointers (tem);
SET_TYPE_UNCONSTRAINED_ARRAY (tem, gnu_type);
and the GNAT node GNAT_SUBPROG. */
extern void build_function_stub (tree gnu_subprog, Entity_Id gnat_subprog);
-/* Build a type to be used to represent an aliased object whose nominal
- type is an unconstrained array. This consists of a RECORD_TYPE containing
- a field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an
- ARRAY_TYPE. If ARRAY_TYPE is that of the unconstrained array, this
- is used to represent an arbitrary unconstrained object. Use NAME
- as the name of the record. */
+/* Build a type to be used to represent an aliased object whose nominal type
+ is an unconstrained array. This consists of a RECORD_TYPE containing a
+ field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an ARRAY_TYPE.
+ If ARRAY_TYPE is that of an unconstrained array, this is used to represent
+ an arbitrary unconstrained object. Use NAME as the name of the record.
+ DEBUG_INFO_P is true if we need to write debug information for the type. */
extern tree build_unc_object_type (tree template_type, tree object_type,
- tree name);
+ tree name, bool debug_info_p);
/* Same as build_unc_object_type, but taking a thin or fat pointer type
instead of the template type. */
extern tree build_unc_object_type_from_ptr (tree thin_fat_ptr_type,
- tree object_type, tree name);
+ tree object_type, tree name,
+ bool debug_info_p);
/* Shift the component offsets within an unconstrained object TYPE to make it
suitable for use as a designated type for thin pointers. */
gnu_type
= build_unc_object_type_from_ptr (gnu_ptr_type,
gnu_actual_obj_type,
- get_identifier ("SIZE"));
+ get_identifier ("SIZE"),
+ false);
}
gnu_result = TYPE_SIZE (gnu_type);
gnu_actual_obj_type
= build_unc_object_type_from_ptr (gnu_ptr_type,
gnu_actual_obj_type,
- get_identifier
- ("DEALLOC"));
+ get_identifier ("DEALLOC"),
+ false);
}
else
gnu_actual_obj_type = gnu_obj_type;
end_subprog_body (gnu_body);
}
\f
-/* Build a type to be used to represent an aliased object whose nominal
- type is an unconstrained array. This consists of a RECORD_TYPE containing
- a field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an
- ARRAY_TYPE. If ARRAY_TYPE is that of the unconstrained array, this
- is used to represent an arbitrary unconstrained object. Use NAME
- as the name of the record. */
+/* Build a type to be used to represent an aliased object whose nominal type
+ is an unconstrained array. This consists of a RECORD_TYPE containing a
+ field of TEMPLATE_TYPE and a field of OBJECT_TYPE, which is an ARRAY_TYPE.
+ If ARRAY_TYPE is that of an unconstrained array, this is used to represent
+ an arbitrary unconstrained object. Use NAME as the name of the record.
+ DEBUG_INFO_P is true if we need to write debug information for the type. */
tree
-build_unc_object_type (tree template_type, tree object_type, tree name)
+build_unc_object_type (tree template_type, tree object_type, tree name,
+ bool debug_info_p)
{
tree type = make_node (RECORD_TYPE);
tree template_field = create_field_decl (get_identifier ("BOUNDS"),
TYPE_NAME (type) = name;
TYPE_CONTAINS_TEMPLATE_P (type) = 1;
- finish_record_type (type,
- chainon (chainon (NULL_TREE, template_field),
- array_field),
- 0, true);
+ TREE_CHAIN (template_field) = array_field;
+ finish_record_type (type, template_field, 0, true);
+
+ /* Declare it now since it will never be declared otherwise. This is
+ necessary to ensure that its subtrees are properly marked. */
+ create_type_decl (name, type, NULL, true, debug_info_p, Empty);
return type;
}
tree
build_unc_object_type_from_ptr (tree thin_fat_ptr_type, tree object_type,
- tree name)
+ tree name, bool debug_info_p)
{
tree template_type;
= (TYPE_IS_FAT_POINTER_P (thin_fat_ptr_type)
? TREE_TYPE (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (thin_fat_ptr_type))))
: TREE_TYPE (TYPE_FIELDS (TREE_TYPE (thin_fat_ptr_type))));
- return build_unc_object_type (template_type, object_type, name);
+
+ return
+ build_unc_object_type (template_type, object_type, name, debug_info_p);
}
/* Shift the component offsets within an unconstrained object TYPE to make it
{
tree storage_type
= build_unc_object_type_from_ptr (result_type, type,
- get_identifier ("ALLOC"));
+ get_identifier ("ALLOC"), false);
tree template_type = TREE_TYPE (TYPE_FIELDS (storage_type));
tree storage_ptr_type = build_pointer_type (storage_type);
tree storage;
+2010-05-08 Quentin Ochem <ochem@adacore.com>
+
+ * gnat.dg/sizetype3.ad[sb]: New test.
+ * gnat.dg/sizetype3_pkg.ads: New helper.
+
2010-05-07 Fabien ChĂȘne <fabien.chene@gmail.com>
PR c++/43951
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Sizetype3_Pkg; use Sizetype3_Pkg;
+
+package body Sizetype3 is
+
+ procedure Handle_Enum_Values is
+ Values : constant List := F;
+ L : Values_Array_Access;
+ begin
+ L := new Values_Array (1 .. Values'Length);
+ end Handle_Enum_Values;
+
+ procedure Simplify_Type_Of is
+ begin
+ Handle_Enum_Values;
+ end Simplify_Type_Of;
+
+end Sizetype3;
--- /dev/null
+package Sizetype3 is
+
+ type Values_Array is array (Positive range <>) of Integer;
+ type Values_Array_Access is access all Values_Array;
+
+ procedure Simplify_Type_Of;
+
+end Sizetype3;
--- /dev/null
+package Sizetype3_Pkg is
+
+ type List is array (Integer range <>) of Integer;
+
+ function F return List;
+
+end Sizetype3_Pkg;