diff options
author | Ed Schonberg <schonberg@adacore.com> | 2005-12-09 18:21:06 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2005-12-09 18:21:06 +0100 |
commit | b5bd964f4a698b0c69a6767a35be9df22f1257a5 (patch) | |
tree | 0f3db1ac48ad611dcc8fdb4f16c60724161fc62a /gcc | |
parent | 5b7f5b7ff963eec025fd52acc80a543d85b5af5b (diff) | |
download | gcc-b5bd964f4a698b0c69a6767a35be9df22f1257a5.zip gcc-b5bd964f4a698b0c69a6767a35be9df22f1257a5.tar.gz gcc-b5bd964f4a698b0c69a6767a35be9df22f1257a5.tar.bz2 |
sem_ch12.adb (Subtypes_Match): Handle properly Ada05 arrays of anonymous access types.
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).
From-SVN: r108301
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_ch12.adb | 16 | ||||
-rw-r--r-- | gcc/ada/sem_eval.adb | 19 |
2 files changed, 27 insertions, 8 deletions
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index 470f5ed..5e8e6dc 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -8090,16 +8090,22 @@ package body Sem_Ch12 is 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; ----------------------------------------- diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index d99e042..3e354ec 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -38,6 +38,7 @@ with Nlists; use Nlists; 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,9 +4057,21 @@ package body Sem_Eval is 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 |