[multiple changes]

2011-08-29  Robert Dewar  <dewar@adacore.com>

	* a-cbhama.adb, a-cbhama.ads: Minor reformatting.

2011-08-29  Javier Miranda  <miranda@adacore.com>

	* sem_ch8.adb (Analyze_Subprogram_Renaming): Complete support for
	renamings of formal subprograms when the actual for a formal type is
	class-wide.

From-SVN: r178244
This commit is contained in:
Arnaud Charlet 2011-08-29 16:23:16 +02:00
parent dfbf013faf
commit fd3d2680c8
4 changed files with 72 additions and 28 deletions

View File

@ -1,3 +1,13 @@
2011-08-29 Robert Dewar <dewar@adacore.com>
* a-cbhama.adb, a-cbhama.ads: Minor reformatting.
2011-08-29 Javier Miranda <miranda@adacore.com>
* sem_ch8.adb (Analyze_Subprogram_Renaming): Complete support for
renamings of formal subprograms when the actual for a formal type is
class-wide.
2011-08-29 Matthew Heaney <heaney@adacore.com> 2011-08-29 Matthew Heaney <heaney@adacore.com>
* a-cbhama.ads, a-cbhase.ads (Move): Clear Source following assignment * a-cbhama.ads, a-cbhase.ads (Move): Clear Source following assignment

View File

@ -424,15 +424,14 @@ package body Ada.Containers.Bounded_Hashed_Maps is
end First; end First;
function First (Object : Iterator) return Cursor is function First (Object : Iterator) return Cursor is
M : constant Map_Access := Object.Container; M : constant Map_Access := Object.Container;
N : constant Count_Type := HT_Ops.First (M.all); N : constant Count_Type := HT_Ops.First (M.all);
begin begin
if N = 0 then if N = 0 then
return No_Element; return No_Element;
else
return Cursor'(Object.Container.all'Unchecked_Access, N);
end if; end if;
return Cursor'(Object.Container.all'Unchecked_Access, N);
end First; end First;
----------------- -----------------

View File

@ -32,7 +32,8 @@
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
private with Ada.Containers.Hash_Tables; private with Ada.Containers.Hash_Tables;
with Ada.Streams; use Ada.Streams;
with Ada.Streams; use Ada.Streams;
with Ada.Iterator_Interfaces; with Ada.Iterator_Interfaces;
generic generic
@ -47,8 +48,7 @@ package Ada.Containers.Bounded_Hashed_Maps is
pragma Pure; pragma Pure;
pragma Remote_Types; pragma Remote_Types;
type Map (Capacity : Count_Type; Modulus : Hash_Type) is tagged private type Map (Capacity : Count_Type; Modulus : Hash_Type) is tagged private with
with
Constant_Indexing => Constant_Reference, Constant_Indexing => Constant_Reference,
Variable_Indexing => Reference, Variable_Indexing => Reference,
Default_Iterator => Iterate, Default_Iterator => Iterate,
@ -328,7 +328,6 @@ package Ada.Containers.Bounded_Hashed_Maps is
return Reference_Type; return Reference_Type;
private private
-- pragma Inline ("=");
pragma Inline (Length); pragma Inline (Length);
pragma Inline (Is_Empty); pragma Inline (Is_Empty);
pragma Inline (Clear); pragma Inline (Clear);
@ -339,7 +338,6 @@ private
pragma Inline (Capacity); pragma Inline (Capacity);
pragma Inline (Reserve_Capacity); pragma Inline (Reserve_Capacity);
pragma Inline (Has_Element); pragma Inline (Has_Element);
-- pragma Inline (Equivalent_Keys);
pragma Inline (Next); pragma Inline (Next);
type Node_Type is record type Node_Type is record

View File

@ -1634,11 +1634,6 @@ package body Sem_Ch8 is
procedure Analyze_Subprogram_Renaming (N : Node_Id) is procedure Analyze_Subprogram_Renaming (N : Node_Id) is
Formal_Spec : constant Node_Id := Corresponding_Formal_Spec (N); Formal_Spec : constant Node_Id := Corresponding_Formal_Spec (N);
Is_Actual : constant Boolean := Present (Formal_Spec); Is_Actual : constant Boolean := Present (Formal_Spec);
CW_Actual : Boolean := False;
-- True if the renaming is for a defaulted formal subprogram when the
-- actual for a related formal type is class-wide. For AI05-0071.
Inst_Node : Node_Id := Empty; Inst_Node : Node_Id := Empty;
Nam : constant Node_Id := Name (N); Nam : constant Node_Id := Name (N);
New_S : Entity_Id; New_S : Entity_Id;
@ -1691,6 +1686,11 @@ package body Sem_Ch8 is
-- This rule only applies if there is no explicit visible class-wide -- This rule only applies if there is no explicit visible class-wide
-- operation at the point of the instantiation. -- operation at the point of the instantiation.
function Has_Class_Wide_Actual return Boolean;
-- Ada 2012 (AI05-071, AI05-0131): True if N is the renaming for a
-- defaulted formal subprogram when the actual for the controlling
-- formal type is class-wide.
----------------------------- -----------------------------
-- Check_Class_Wide_Actual -- -- Check_Class_Wide_Actual --
----------------------------- -----------------------------
@ -1729,7 +1729,7 @@ package body Sem_Ch8 is
Next (F); Next (F);
end loop; end loop;
if Ekind (Prim_Op) = E_Function then if Ekind_In (Prim_Op, E_Function, E_Operator) then
return Make_Simple_Return_Statement (Loc, return Make_Simple_Return_Statement (Loc,
Expression => Expression =>
Make_Function_Call (Loc, Make_Function_Call (Loc,
@ -1780,6 +1780,7 @@ package body Sem_Ch8 is
F := First_Formal (Formal_Spec); F := First_Formal (Formal_Spec);
while Present (F) loop while Present (F) loop
if Has_Unknown_Discriminants (Etype (F)) if Has_Unknown_Discriminants (Etype (F))
and then not Is_Class_Wide_Type (Etype (F))
and then Is_Class_Wide_Type (Get_Instance_Of (Etype (F))) and then Is_Class_Wide_Type (Get_Instance_Of (Etype (F)))
then then
Formal_Type := Etype (F); Formal_Type := Etype (F);
@ -1791,7 +1792,6 @@ package body Sem_Ch8 is
end loop; end loop;
if Present (Formal_Type) then if Present (Formal_Type) then
CW_Actual := True;
-- Create declaration and body for class-wide operation -- Create declaration and body for class-wide operation
@ -1893,6 +1893,41 @@ package body Sem_Ch8 is
end if; end if;
end Check_Null_Exclusion; end Check_Null_Exclusion;
---------------------------
-- Has_Class_Wide_Actual --
---------------------------
function Has_Class_Wide_Actual return Boolean is
F_Nam : Entity_Id;
F_Spec : Entity_Id;
begin
if Is_Actual
and then Nkind (Nam) in N_Has_Entity
and then Present (Entity (Nam))
and then Is_Dispatching_Operation (Entity (Nam))
then
F_Nam := First_Entity (Entity (Nam));
F_Spec := First_Formal (Formal_Spec);
while Present (F_Nam)
and then Present (F_Spec)
loop
if Is_Controlling_Formal (F_Nam)
and then Has_Unknown_Discriminants (Etype (F_Spec))
and then not Is_Class_Wide_Type (Etype (F_Spec))
and then Is_Class_Wide_Type (Get_Instance_Of (Etype (F_Spec)))
then
return True;
end if;
Next_Entity (F_Nam);
Next_Formal (F_Spec);
end loop;
end if;
return False;
end Has_Class_Wide_Actual;
------------------------- -------------------------
-- Original_Subprogram -- -- Original_Subprogram --
------------------------- -------------------------
@ -1938,6 +1973,11 @@ package body Sem_Ch8 is
end if; end if;
end Original_Subprogram; end Original_Subprogram;
CW_Actual : constant Boolean := Has_Class_Wide_Actual;
-- Ada 2012 (AI05-071, AI05-0131): True if the renaming is for a
-- defaulted formal subprogram when the actual for a related formal
-- type is class-wide.
-- Start of processing for Analyze_Subprogram_Renaming -- Start of processing for Analyze_Subprogram_Renaming
begin begin
@ -2058,7 +2098,14 @@ package body Sem_Ch8 is
if Is_Actual then if Is_Actual then
Inst_Node := Unit_Declaration_Node (Formal_Spec); Inst_Node := Unit_Declaration_Node (Formal_Spec);
if Is_Entity_Name (Nam) -- Check whether the renaming is for a defaulted actual subprogram
-- with a class-wide actual.
if CW_Actual then
New_S := Analyze_Subprogram_Specification (Spec);
Old_S := Check_Class_Wide_Actual;
elsif Is_Entity_Name (Nam)
and then Present (Entity (Nam)) and then Present (Entity (Nam))
and then not Comes_From_Source (Nam) and then not Comes_From_Source (Nam)
and then not Is_Overloaded (Nam) and then not Is_Overloaded (Nam)
@ -2419,16 +2466,6 @@ package body Sem_Ch8 is
end if; end if;
end if; end if;
-- If no renamed entity was found, check whether the renaming is for
-- a defaulted actual subprogram with a class-wide actual.
if Old_S = Any_Id
and then Is_Actual
and then From_Default (N)
then
Old_S := Check_Class_Wide_Actual;
end if;
if Old_S /= Any_Id then if Old_S /= Any_Id then
if Is_Actual and then From_Default (N) then if Is_Actual and then From_Default (N) then