[Ada] Legality checks on a formal derived type derived from previous formal.

Arnaud Charlet charlet@adacore.com
Tue May 12 15:01:00 GMT 2015


This patch adds a missing legality check on the instantiation of a formal
derived type whose parent type is a previous formal of the same generic unit,
that is not a derived type.

Compiling generic_testm.adb must yield:

 generic_testm.adb:7:26: expect type derived from "Integer" in instantiation
 generic_testm.adb:7:26: instantiation abandoned
 generic_testm.adb:20:26: expect type derived from "Boolean" in instantiation
 generic_testm.adb:20:26: instantiation abandoned
 generic_testm.adb:26:10: "Convert" is undefined (more references follow)
 generic_testm.adb:32:15: "Convert_Pfff" is undefined

---

with Generic_Test;

procedure Generic_TestM is
   package Convert is new Generic_Test
     (Data_Type       => Natural,
      Other_Data_Type => Boolean);

   From : constant Natural := Natural'First;
   To   : Boolean;

   type Pfff is
      record
         Pff_1 : Natural;
         Pff_2 : Character;
      end record;

   package Convert_Pfff is new Generic_Test
     (Data_Type       => Boolean,
      Other_Data_Type => Pfff);

   To_Pfff   : Pfff;
   From_Pfff : constant Boolean := Boolean'First;
begin

   To := Convert.Data_To_Other (Data => From);

   if To /= Convert.Data_To_Other (Data => 0) then
      raise Constraint_Error;
   end if;

   To_Pfff := Convert_Pfff.Data_To_Other
     (Data => From_Pfff);

   if not To_Pfff.Pff_1'Valid or not To_Pfff.Pff_2'Valid then
      raise Constraint_Error;
   end if;
end;
---
generic

   type Data_Type is (<>);

   type Other_Data_Type is new Data_Type;

package Generic_Test is

   --  Add the parameter with provided Id and its value
   --  to the list of parameters.

   function Data_To_Other
     (Data : in Data_Type)
      return Other_Data_Type;
end Generic_Test;
--

package body Generic_Test is
   function Data_To_Other
     (Data : in Data_Type)
      return Other_Data_Type
   is
   begin
      return Other_Data_Type (Data);
   end Data_To_Other;
end Generic_Test;

Tested on x86_64-pc-linux-gnu, committed on trunk

2015-05-12  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch12.adb (Validate_Derived_Type_Instance): Handle properly
	the checks on a derived formal whose parent type is a previous
	formal that is not a derived type.

-------------- next part --------------
Index: sem_ch12.adb
===================================================================
--- sem_ch12.adb	(revision 223064)
+++ sem_ch12.adb	(working copy)
@@ -11698,6 +11698,14 @@
                  Get_Instance_Of (Base_Type (Get_Instance_Of (A_Gen_T)));
             end if;
 
+         --  Check whether parent is a previous formal of the current generic
+
+         elsif Is_Derived_Type (A_Gen_T)
+           and then Is_Generic_Type (Etype (A_Gen_T))
+           and then Scope (A_Gen_T) = Scope (Etype (A_Gen_T))
+         then
+            Ancestor := Get_Instance_Of (First_Subtype (Etype (A_Gen_T)));
+
          --  An unusual case: the actual is a type declared in a parent unit,
          --  but is not a formal type so there is no instance_of for it.
          --  Retrieve it by analyzing the record extension.
@@ -11733,6 +11741,9 @@
                   Actual, Ancestor);
             end if;
 
+         --  Finally verify that the (instance of) the ancestor is an ancestor
+         --  of the actual.
+
          elsif not Is_Ancestor (Base_Type (Ancestor), Act_T) then
             Error_Msg_NE
               ("expect type derived from & in instantiation",


More information about the Gcc-patches mailing list