[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