aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2015-11-24 09:00:45 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2015-11-24 09:00:45 +0000
commitc4833de12598fbc5d8efb413a89ae6cf98b5f459 (patch)
tree9220dc1c269c874df02585567bdb0a21cfcb3364 /gcc
parent93200f92e5e0c4450e7a350887112f9c974d8e3f (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/ada/gcc-interface/decl.c46
-rw-r--r--gcc/ada/gcc-interface/trans.c19
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 ();