[Ada] Fix bug in Ada 2005 anonymous access types handling

Arnaud Charlet charlet@adacore.com
Fri Dec 9 17:30:00 GMT 2005


Tested on i686-linux, committed on trunk

In Ada 2005 anonymous access types and access-to-subprogram types can be
used as component types, and there are new matching rules for them when
they are used as formal types and in conversions. The following must
compile quietly:
gcc -c -gnat05 h.ads
--
generic
   type Index_Type is (<>);
   type Array_Type is array (Index_Type) of access procedure;
package G is end;
--
with G;
package H is
   type Array_Type is array (Boolean) of access procedure;
   package GI is new G (Boolean, Array_Type);
end;

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

	* sem_ch12.adb (Subtypes_Match): Handle properly Ada05 arrays of
	anonymous access types.

	* sem_eval.adb (Subtypes_Statically_Match): Implement new rules for
	matching of anonymous access types and anonymous access to subprogram
	types. 'R'M 4.9.1 (2/2).

-------------- next part --------------
Index: sem_ch12.adb
===================================================================
--- sem_ch12.adb	(revision 108280)
+++ sem_ch12.adb	(working copy)
@@ -8090,16 +8090,22 @@
 
       begin
          return (Base_Type (T) = Base_Type (Act_T)
---  why is the and then commented out here???
---                  and then Is_Constrained (T) = Is_Constrained (Act_T)
                   and then Subtypes_Statically_Match (T, Act_T))
 
            or else (Is_Class_Wide_Type (Gen_T)
                      and then Is_Class_Wide_Type (Act_T)
                      and then
-                       Subtypes_Match (
-                         Get_Instance_Of (Root_Type (Gen_T)),
-                         Root_Type (Act_T)));
+                       Subtypes_Match
+                        (Get_Instance_Of (Root_Type (Gen_T)),
+                         Root_Type (Act_T)))
+
+           or else
+             ((Ekind (Gen_T) = E_Anonymous_Access_Subprogram_Type
+                 or else Ekind (Gen_T) = E_Anonymous_Access_Type)
+               and then Ekind (Act_T) = Ekind (Gen_T)
+               and then
+                 Subtypes_Statically_Match
+                   (Designated_Type (Gen_T), Designated_Type (Act_T)));
       end Subtypes_Match;
 
       -----------------------------------------
Index: sem_eval.adb
===================================================================
--- sem_eval.adb	(revision 108280)
+++ sem_eval.adb	(working copy)
@@ -38,6 +38,7 @@
 with Opt;      use Opt;
 with Sem;      use Sem;
 with Sem_Cat;  use Sem_Cat;
+with Sem_Ch6;  use Sem_Ch6;
 with Sem_Ch8;  use Sem_Ch8;
 with Sem_Res;  use Sem_Res;
 with Sem_Util; use Sem_Util;
@@ -4056,10 +4057,22 @@
          end;
 
       elsif Is_Access_Type (T1) then
-         return Subtypes_Statically_Match
-                  (Designated_Type (T1),
-                   Designated_Type (T2));
+         if Can_Never_Be_Null (T1) /= Can_Never_Be_Null (T2) then
+            return False;
 
+         elsif Ekind (T1) = E_Access_Subprogram_Type then
+            return
+              Subtype_Conformant
+                (Designated_Type (T1),
+                 Designated_Type (T1));
+         else
+            return
+              Subtypes_Statically_Match
+                (Designated_Type (T1),
+                 Designated_Type (T2))
+              and then Is_Access_Constant (T1) = Is_Access_Constant (T2);
+         end if;
+
       --  All other types definitely match
 
       else


More information about the Gcc-patches mailing list