diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2015-11-24 09:00:45 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2015-11-24 09:00:45 +0000 |
commit | c4833de12598fbc5d8efb413a89ae6cf98b5f459 (patch) | |
tree | 9220dc1c269c874df02585567bdb0a21cfcb3364 /gcc | |
parent | 93200f92e5e0c4450e7a350887112f9c974d8e3f (diff) | |
download | gcc-c4833de12598fbc5d8efb413a89ae6cf98b5f459.zip gcc-c4833de12598fbc5d8efb413a89ae6cf98b5f459.tar.gz gcc-c4833de12598fbc5d8efb413a89ae6cf98b5f459.tar.bz2 |
decl.c (gnat_to_gnu_entity): In ASIS mode, do a minimal translation for root types with discriminants.
* 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.
From-SVN: r230792
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 46 | ||||
-rw-r--r-- | 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 e95343b..caea65a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,13 @@ 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 not build a NULL_EXPR for an N_Expanded_Name. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 9994c67..3ae079f 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 ebb5b5c..fdcf9a3 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 (); |