diff mbox

[Ada] Make Gigi_Equivalent_Type idempotent

Message ID 5594588.XH51ASFkAK@polaris
State New
Headers show

Commit Message

Eric Botcazou June 6, 2016, 10:03 a.m. UTC
This fixes a small regression in ASIS mode introduced by the new elaboration 
model for subprograms.  Tested on x86_64-suse-linux, applied on the mainline.


2016-06-06  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (Gigi_Equivalent_Type): Make sure equivalent
	types are present before returning them.  Remove final assertion.
	(gnat_to_gnu_entity) <E_Access_Protected_Subprogram_Type>: Adjust to
	above change.
	<E_Protected_Type>: Likewise.
diff mbox

Patch

Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 322166)
+++ gcc-interface/decl.c	(revision 322167)
@@ -4005,9 +4005,12 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 
     case E_Access_Protected_Subprogram_Type:
     case E_Anonymous_Access_Protected_Subprogram_Type:
-      /* The run-time representation is the equivalent type.  */
-      if (type_annotate_only && No (gnat_equiv_type))
+      /* If we are just annotating types and have no equivalent record type,
+	 just return ptr_void_type.  */
+      if (type_annotate_only && gnat_equiv_type == gnat_entity)
 	gnu_type = ptr_type_node;
+
+      /* The run-time representation is the equivalent type.  */
       else
 	{
 	  gnu_type = gnat_to_gnu_type (gnat_equiv_type);
@@ -4373,7 +4376,7 @@  gnat_to_gnu_entity (Entity_Id gnat_entit
 	 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))
+      if (type_annotate_only && gnat_equiv_type == gnat_entity)
 	{
 	  if (Has_Discriminants (gnat_entity)
 	      && Root_Type (gnat_entity) == gnat_entity)
@@ -5139,26 +5142,26 @@  Gigi_Equivalent_Type (Entity_Id gnat_ent
 
     case E_Access_Protected_Subprogram_Type:
     case E_Anonymous_Access_Protected_Subprogram_Type:
-      gnat_equiv = Equivalent_Type (gnat_entity);
+      if (Present (Equivalent_Type (gnat_entity)))
+	gnat_equiv = Equivalent_Type (gnat_entity);
       break;
 
     case E_Class_Wide_Type:
       gnat_equiv = Root_Type (gnat_entity);
       break;
 
-    case E_Task_Type:
-    case E_Task_Subtype:
     case E_Protected_Type:
     case E_Protected_Subtype:
-      gnat_equiv = Corresponding_Record_Type (gnat_entity);
+    case E_Task_Type:
+    case E_Task_Subtype:
+      if (Present (Corresponding_Record_Type (gnat_entity)))
+	gnat_equiv = Corresponding_Record_Type (gnat_entity);
       break;
 
     default:
       break;
     }
 
-  gcc_assert (Present (gnat_equiv) || type_annotate_only);
-
   return gnat_equiv;
 }