From 924b0f28c6d28bcf301fc91b7fa7b4bc08f939c3 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Tue, 24 Nov 2015 09:00:45 +0000 Subject: [PATCH] * gcc-interface/decl.c (gnat_to_gnu_entity) : In ASIS mode, do a minimal translation for root types with discriminants. * gcc-interface/trans.c (gnat_to_gnu) : Move around. : Likewise. In ASIS mode, process the declarations attached to the body. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230792 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 8 ++++++ gcc/ada/gcc-interface/decl.c | 46 ++++++++++++++++++++++++++++++++--- gcc/ada/gcc-interface/trans.c | 19 ++++++++++----- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e95343be782b..caea65a6a221 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2015-11-24 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_entity) : In + ASIS mode, do a minimal translation for root types with discriminants. + * gcc-interface/trans.c (gnat_to_gnu) : Move around. + : Likewise. In ASIS mode, + process the declarations attached to the body. + 2015-11-24 Eric Botcazou * gcc-interface/trans.c (gnat_to_gnu): In type_annotate_only mode, do diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 9994c679a40a..3ae079ff9047 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -4737,13 +4737,51 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) 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; diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index ebb5b5ca2a0d..fdcf9a3c2203 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -7272,6 +7272,19 @@ gnat_to_gnu (Node_Id gnat_node) 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: @@ -7286,10 +7299,6 @@ gnat_to_gnu (Node_Id gnat_node) } break; - case N_Subunit: - gnu_result = gnat_to_gnu (Proper_Body (gnat_node)); - break; - /***************************/ /* Chapter 11: Exceptions */ /***************************/ @@ -7662,8 +7671,6 @@ gnat_to_gnu (Node_Id gnat_node) 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 (); -- 2.47.2