+2015-11-24 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/decl.c (gnat_to_gnu_entity) <Concurrent types>: In
+ ASIS mode, do a minimal translation for root types with discriminants.
+ * gcc-interface/trans.c (gnat_to_gnu) <N_Subunit>: Move around.
+ <N_Entry_Body, N_Protected_Body, N_Task_Body>: Likewise. In ASIS mode,
+ process the declarations attached to the body.
+
2015-11-24 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (gnat_to_gnu): In type_annotate_only mode, do
maybe_present = true;
break;
- case E_Task_Type:
- case E_Task_Subtype:
case E_Protected_Type:
case E_Protected_Subtype:
- /* Concurrent types are always transformed into their record type. */
+ case E_Task_Type:
+ case E_Task_Subtype:
+ /* If we are just annotating types and have no equivalent record type,
+ just return void_type, except for root types that have discriminants
+ because the discriminants will very likely be used in the declarative
+ part of the associated body so they need to be translated. */
if (type_annotate_only && No (gnat_equiv_type))
- gnu_type = void_type_node;
+ {
+ if (Has_Discriminants (gnat_entity)
+ && Root_Type (gnat_entity) == gnat_entity)
+ {
+ tree gnu_field_list = NULL_TREE;
+ Entity_Id gnat_field;
+
+ /* This is a minimal version of the E_Record_Type handling. */
+ gnu_type = make_node (RECORD_TYPE);
+ TYPE_NAME (gnu_type) = gnu_entity_name;
+
+ for (gnat_field = First_Stored_Discriminant (gnat_entity);
+ Present (gnat_field);
+ gnat_field = Next_Stored_Discriminant (gnat_field))
+ {
+ tree gnu_field
+ = gnat_to_gnu_field (gnat_field, gnu_type, false,
+ definition, debug_info_p);
+
+ save_gnu_tree (gnat_field,
+ build3 (COMPONENT_REF, TREE_TYPE (gnu_field),
+ build0 (PLACEHOLDER_EXPR, gnu_type),
+ gnu_field, NULL_TREE),
+ true);
+
+ DECL_CHAIN (gnu_field) = gnu_field_list;
+ gnu_field_list = gnu_field;
+ }
+
+ TYPE_FIELDS (gnu_type) = nreverse (gnu_field_list);
+ }
+ else
+ gnu_type = void_type_node;
+ }
+
+ /* Concurrent types are always transformed into their record type. */
else
gnu_decl = gnat_to_gnu_entity (gnat_equiv_type, NULL_TREE, 0);
maybe_present = true;
gnu_result = alloc_stmt_list ();
break;
+ case N_Subunit:
+ gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
+ break;
+
+ case N_Entry_Body:
+ case N_Protected_Body:
+ case N_Task_Body:
+ /* These nodes should only be present when annotating types. */
+ gcc_assert (type_annotate_only);
+ process_decls (Declarations (gnat_node), Empty, Empty, true, true);
+ gnu_result = alloc_stmt_list ();
+ break;
+
case N_Subprogram_Body_Stub:
case N_Package_Body_Stub:
case N_Protected_Body_Stub:
}
break;
- case N_Subunit:
- gnu_result = gnat_to_gnu (Proper_Body (gnat_node));
- break;
-
/***************************/
/* Chapter 11: Exceptions */
/***************************/
case N_Procedure_Specification:
case N_Op_Concat:
case N_Component_Association:
- case N_Protected_Body:
- case N_Task_Body:
/* These nodes should only be present when annotating types. */
gcc_assert (type_annotate_only);
gnu_result = alloc_stmt_list ();