decl.c (Gigi_Equivalent_Type): Make sure equivalent types are present before returnin...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 6 Jun 2016 10:03:14 +0000 (10:03 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 6 Jun 2016 10:03:14 +0000 (10:03 +0000)
* 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.

From-SVN: r237130

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index 5ffc2486a38475192db67d6f82ed3691cf687345..20edf04ee223752e24c9e54601f71f0d99d8f01f 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2016-06-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (elaborate_all_entities_for_package): Also do
index c3aee4829a3ba292c5f2f86744522654d33892f2..45878a7c6357debf8a9503506c563b4386d6cefb 100644 (file)
@@ -4009,9 +4009,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
 
     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);
@@ -4377,7 +4380,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
         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)
@@ -5143,26 +5146,26 @@ Gigi_Equivalent_Type (Entity_Id gnat_entity)
 
     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;
 }