diff options
author | Ed Schonberg <schonberg@adacore.com> | 2006-10-31 19:09:49 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2006-10-31 19:09:49 +0100 |
commit | 60573ca25ab315e4825a035ef67d59a23e645b52 (patch) | |
tree | 0009d8fedb88e155dcb2076f7b0cb2918c772ac4 /gcc/ada | |
parent | 29797f340dccaaa714e993426b925f23f94d362c (diff) | |
download | gcc-60573ca25ab315e4825a035ef67d59a23e645b52.zip gcc-60573ca25ab315e4825a035ef67d59a23e645b52.tar.gz gcc-60573ca25ab315e4825a035ef67d59a23e645b52.tar.bz2 |
sem_type.adb (Add_One_Interp): If node is an indirect call...
2006-10-31 Ed Schonberg <schonberg@adacore.com>
Hristian Kirtchev <kirtchev@adacore.com>
Javier Miranda <miranda@adacore.com>
* sem_type.adb (Add_One_Interp): If node is an indirect call, preserve
subprogram type to provide better diagnostics in case of ambiguity.
(Covers): Handle coverage of formal and actual anonymous access types in
the context of generic instantiation.
(Covers/Interface_Present_In_Ancestors): Use the base type to manage
abstract interface types; this is required to handle concurrent types
with discriminants and abstract interface types.
(Covers): Include type coverage of both regular incomplete subtypes and
incomplete subtypes of incomplete type visibles through a limited with
clause.
From-SVN: r118311
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/sem_type.adb | 140 |
1 files changed, 100 insertions, 40 deletions
diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb index cedd4c5..a33a397 100644 --- a/gcc/ada/sem_type.adb +++ b/gcc/ada/sem_type.adb @@ -35,10 +35,11 @@ with Lib; use Lib; with Namet; use Namet; with Opt; use Opt; with Output; use Output; -with Rtsfind; use Rtsfind; with Sem; use Sem; with Sem_Ch6; use Sem_Ch6; with Sem_Ch8; use Sem_Ch8; +with Sem_Ch12; use Sem_Ch12; +with Sem_Disp; use Sem_Disp; with Sem_Util; use Sem_Util; with Stand; use Stand; with Sinfo; use Sinfo; @@ -394,9 +395,9 @@ package body Sem_Type is -- because otherwise we have a dummy between the two subprograms that -- are in fact the same. - if Present (DTC_Entity (Abstract_Interface_Alias (E))) - and then Etype (DTC_Entity (Abstract_Interface_Alias (E))) - /= RTE (RE_Tag) + if not Is_Ancestor + (Find_Dispatching_Type (Abstract_Interface_Alias (E)), + Find_Dispatching_Type (E)) then Add_One_Interp (N, Abstract_Interface_Alias (E), T); end if; @@ -447,6 +448,24 @@ package body Sem_Type is then Add_Entry (Entity (Name (N)), Etype (N)); + -- If this is an indirect call there will be no name associated + -- with the previous entry. To make diagnostics clearer, save + -- Subprogram_Type of first interpretation, so that the error will + -- point to the anonymous access to subprogram, not to the result + -- type of the call itself. + + elsif (Nkind (N)) = N_Function_Call + and then Nkind (Name (N)) = N_Explicit_Dereference + and then Is_Overloaded (Name (N)) + then + declare + I : Interp_Index; + It : Interp; + begin + Get_First_Interp (Name (N), I, It); + Add_Entry (It.Nam, Etype (N)); + end; + else -- Overloaded prefix in indexed or selected component, -- or call whose name is an expression or another call. @@ -735,36 +754,45 @@ package body Sem_Type is and then Is_Interface (Etype (T1)) and then Is_Tagged_Type (T2) then - if Interface_Present_In_Ancestor (Typ => T2, + if Interface_Present_In_Ancestor (Typ => T2, Iface => Etype (T1)) then return True; + end if; + + declare + E : Entity_Id; + Elmt : Elmt_Id; - elsif Present (Abstract_Interfaces (T2)) then + begin + if Is_Concurrent_Type (BT2) then + E := Corresponding_Record_Type (BT2); + else + E := BT2; + end if; -- Ada 2005 (AI-251): A class-wide abstract interface type T1 -- covers an object T2 that implements a direct derivation of T1. + -- Note: test for presence of E is defense against previous error. - declare - E : Elmt_Id := First_Elmt (Abstract_Interfaces (T2)); - begin - while Present (E) loop - if Is_Ancestor (Etype (T1), Node (E)) then + if Present (E) + and then Present (Abstract_Interfaces (E)) + then + Elmt := First_Elmt (Abstract_Interfaces (E)); + while Present (Elmt) loop + if Is_Ancestor (Etype (T1), Node (Elmt)) then return True; end if; - Next_Elmt (E); + Next_Elmt (Elmt); end loop; - end; + end if; -- We should also check the case in which T1 is an ancestor of -- some implemented interface??? return False; - - else - return False; - end if; + end; -- In a dispatching call the actual may be class-wide @@ -959,7 +987,7 @@ package body Sem_Type is -- If the expected type is the non-limited view of a type, the -- expression may have the limited view. - if Ekind (T1) = E_Incomplete_Type then + if Is_Incomplete_Type (T1) then return Covers (Non_Limited_View (T1), T2); elsif Ekind (T1) = E_Class_Wide_Type then @@ -975,7 +1003,7 @@ package body Sem_Type is -- either type might have a limited view. Checks performed elsewhere -- verify that the context type is the non-limited view. - if Ekind (T2) = E_Incomplete_Type then + if Is_Incomplete_Type (T2) then return Covers (T1, Non_Limited_View (T2)); elsif Ekind (T2) = E_Class_Wide_Type then @@ -985,6 +1013,38 @@ package body Sem_Type is return False; end if; + -- Ada 2005 (AI-412): Coverage for regular incomplete subtypes + + elsif Ekind (T1) = E_Incomplete_Subtype then + return Covers (Full_View (Etype (T1)), T2); + + elsif Ekind (T2) = E_Incomplete_Subtype then + return Covers (T1, Full_View (Etype (T2))); + + -- Ada 2005 (AI-423): Coverage of formal anonymous access types + -- and actual anonymous access types in the context of generic + -- instantiation. We have the following situation: + + -- generic + -- type Formal is private; + -- Formal_Obj : access Formal; -- T1 + -- package G is ... + + -- package P is + -- type Actual is ... + -- Actual_Obj : access Actual; -- T2 + -- package Instance is new G (Formal => Actual, + -- Formal_Obj => Actual_Obj); + + elsif Ada_Version >= Ada_05 + and then Ekind (T1) = E_Anonymous_Access_Type + and then Ekind (T2) = E_Anonymous_Access_Type + and then Is_Generic_Type (Directly_Designated_Type (T1)) + and then Get_Instance_Of (Directly_Designated_Type (T1)) = + Directly_Designated_Type (T2) + then + return True; + -- Otherwise it doesn't cover! else @@ -1354,9 +1414,9 @@ package body Sem_Type is -- operating in an earlier mode, in which case we discard the Ada -- 2005 entity, so that we get proper Ada 95 overload resolution. - if Is_Ada_2005 (Nam1) then + if Is_Ada_2005_Only (Nam1) then return It2; - elsif Is_Ada_2005 (Nam2) then + elsif Is_Ada_2005_Only (Nam2) then return It1; end if; end if; @@ -2050,12 +2110,12 @@ package body Sem_Type is -- list of interfaces (available in the parent of the concurrent type) if Is_Concurrent_Type (Target_Typ) then - if Present (Interface_List (Parent (Target_Typ))) then + if Present (Interface_List (Parent (Base_Type (Target_Typ)))) then declare AI : Node_Id; begin - AI := First (Interface_List (Parent (Target_Typ))); + AI := First (Interface_List (Parent (Base_Type (Target_Typ)))); while Present (AI) loop if Etype (AI) = Iface then return True; @@ -2304,11 +2364,11 @@ package body Sem_Type is and then Scope (It.Typ) /= Standard_Standard then Error_Msg_Sloc := Sloc (Parent (It.Typ)); - Error_Msg_NE (" & (inherited) declared#!", Err, It.Nam); + Error_Msg_NE ("\\& (inherited) declared#!", Err, It.Nam); else Error_Msg_Sloc := Sloc (It.Nam); - Error_Msg_NE (" & declared#!", Err, It.Nam); + Error_Msg_NE ("\\& declared#!", Err, It.Nam); end if; Get_Next_Interp (Index, It); @@ -2792,6 +2852,21 @@ package body Sem_Type is end if; end Valid_Comparison_Arg; + ---------------------- + -- Write_Interp_Ref -- + ---------------------- + + procedure Write_Interp_Ref (Map_Ptr : Int) is + begin + Write_Str (" Node: "); + Write_Int (Int (Interp_Map.Table (Map_Ptr).Node)); + Write_Str (" Index: "); + Write_Int (Int (Interp_Map.Table (Map_Ptr).Index)); + Write_Str (" Next: "); + Write_Int (Int (Interp_Map.Table (Map_Ptr).Next)); + Write_Eol; + end Write_Interp_Ref; + --------------------- -- Write_Overloads -- --------------------- @@ -2832,19 +2907,4 @@ package body Sem_Type is end if; end Write_Overloads; - ---------------------- - -- Write_Interp_Ref -- - ---------------------- - - procedure Write_Interp_Ref (Map_Ptr : Int) is - begin - Write_Str (" Node: "); - Write_Int (Int (Interp_Map.Table (Map_Ptr).Node)); - Write_Str (" Index: "); - Write_Int (Int (Interp_Map.Table (Map_Ptr).Index)); - Write_Str (" Next: "); - Write_Int (Int (Interp_Map.Table (Map_Ptr).Next)); - Write_Eol; - end Write_Interp_Ref; - end Sem_Type; |