exp_ch9.adb (Build_Renamed_Formal_Declaration): common procedure for protected entries and task entries...
2011-08-03 Ed Schonberg <schonberg@adacore.com> * exp_ch9.adb (Build_Renamed_Formal_Declaration): common procedure for protected entries and task entries, to build the proper renaming declaration for entry formals, used in debugging. * exp_ch2.adb (Expand_Entry_Parameter): handle task and entry parameters in the same way. From-SVN: r177232
This commit is contained in:
parent
40f2f11f1f
commit
b474d6c3f1
@ -1,3 +1,11 @@
|
||||
2011-08-03 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* exp_ch9.adb (Build_Renamed_Formal_Declaration): common procedure for
|
||||
protected entries and task entries, to build the proper renaming
|
||||
declaration for entry formals, used in debugging.
|
||||
* exp_ch2.adb (Expand_Entry_Parameter): handle task and entry
|
||||
parameters in the same way.
|
||||
|
||||
2011-08-02 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* a-direct.adb, sinfo.ads, exp_ch9.adb, scng.adb, sem_util.adb,
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- B o d y --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -520,9 +520,6 @@ package body Exp_Ch2 is
|
||||
then
|
||||
Note_Possible_Modification (N, Sure => True);
|
||||
end if;
|
||||
|
||||
Rewrite (N, New_Occurrence_Of (Renamed_Object (Entity (N)), Loc));
|
||||
return;
|
||||
end if;
|
||||
|
||||
-- What we need is a reference to the corresponding component of the
|
||||
@ -532,6 +529,9 @@ package body Exp_Ch2 is
|
||||
-- to turn this into a pointer to the parameter record and then we
|
||||
-- select the required parameter field.
|
||||
|
||||
-- The same processing applies to protected entries, where the Accept_
|
||||
-- Address is also the address of the Parameters record.
|
||||
|
||||
P_Comp_Ref :=
|
||||
Make_Selected_Component (Loc,
|
||||
Prefix =>
|
||||
|
@ -170,6 +170,19 @@ package body Exp_Ch9 is
|
||||
-- and Decl is the enclosing synchronized type declaration at whose
|
||||
-- freeze point the generated body is analyzed.
|
||||
|
||||
function Build_Renamed_Formal_Declaration
|
||||
(New_F : Entity_Id;
|
||||
Formal : Entity_Id;
|
||||
Comp : Entity_Id;
|
||||
Renamed_Formal : Node_Id) return Node_Id;
|
||||
-- Create a renaming declaration for a formal, within a protected entry
|
||||
-- body or an accept body. The renamed object is a component of the
|
||||
-- parameter block that is a parameter in the entry call.
|
||||
|
||||
-- In Ada2012, If the formal is an incomplete tagged type, the renaming
|
||||
-- does not dereference the corresponding component to prevent an illegal
|
||||
-- use of the incomplete type (AI05-0151).
|
||||
|
||||
procedure Build_Wrapper_Bodies
|
||||
(Loc : Source_Ptr;
|
||||
Typ : Entity_Id;
|
||||
@ -637,10 +650,11 @@ package body Exp_Ch9 is
|
||||
-- The name of the formal that holds the address of the parameter block
|
||||
-- for the call.
|
||||
|
||||
Comp : Entity_Id;
|
||||
Decl : Node_Id;
|
||||
Formal : Entity_Id;
|
||||
New_F : Entity_Id;
|
||||
Comp : Entity_Id;
|
||||
Decl : Node_Id;
|
||||
Formal : Entity_Id;
|
||||
New_F : Entity_Id;
|
||||
Renamed_Formal : Node_Id;
|
||||
|
||||
begin
|
||||
Formal := First_Formal (Ent);
|
||||
@ -667,18 +681,16 @@ package body Exp_Ch9 is
|
||||
|
||||
Set_Actual_Subtype (New_F, Actual_Subtype (Formal));
|
||||
|
||||
Renamed_Formal :=
|
||||
Make_Selected_Component (Loc,
|
||||
Prefix =>
|
||||
Unchecked_Convert_To (Entry_Parameters_Type (Ent),
|
||||
Make_Identifier (Loc, Chars (Ptr))),
|
||||
Selector_Name => New_Reference_To (Comp, Loc));
|
||||
|
||||
Decl :=
|
||||
Make_Object_Renaming_Declaration (Loc,
|
||||
Defining_Identifier => New_F,
|
||||
Subtype_Mark =>
|
||||
New_Reference_To (Etype (Formal), Loc),
|
||||
Name =>
|
||||
Make_Explicit_Dereference (Loc,
|
||||
Make_Selected_Component (Loc,
|
||||
Prefix =>
|
||||
Unchecked_Convert_To (Entry_Parameters_Type (Ent),
|
||||
Make_Identifier (Loc, Chars (Ptr))),
|
||||
Selector_Name => New_Reference_To (Comp, Loc))));
|
||||
Build_Renamed_Formal_Declaration
|
||||
(New_F, Formal, Comp, Renamed_Formal);
|
||||
|
||||
Append (Decl, Decls);
|
||||
Set_Renamed_Object (Formal, New_F);
|
||||
@ -1576,6 +1588,46 @@ package body Exp_Ch9 is
|
||||
return Rec_Nam;
|
||||
end Build_Parameter_Block;
|
||||
|
||||
--------------------------------------
|
||||
-- Build_Renamed_Formal_Declaration --
|
||||
--------------------------------------
|
||||
|
||||
function Build_Renamed_Formal_Declaration
|
||||
(New_F : Entity_Id;
|
||||
Formal : Entity_Id;
|
||||
Comp : Entity_Id;
|
||||
Renamed_Formal : Node_Id) return Node_Id
|
||||
is
|
||||
Loc : constant Source_Ptr := Sloc (New_F);
|
||||
Decl : Node_Id;
|
||||
|
||||
begin
|
||||
-- If the formal is a tagged incomplete type, it is already passed
|
||||
-- by reference, so it is sufficient to rename the pointer component
|
||||
-- that corresponds to the actual. Otherwise we need to dereference
|
||||
-- the pointer component to obtain the actual.
|
||||
|
||||
if Is_Incomplete_Type (Etype (Formal))
|
||||
and then Is_Tagged_Type (Etype (Formal))
|
||||
then
|
||||
Decl :=
|
||||
Make_Object_Renaming_Declaration (Loc,
|
||||
Defining_Identifier => New_F,
|
||||
Subtype_Mark => New_Reference_To (Etype (Comp), Loc),
|
||||
Name => Renamed_Formal);
|
||||
|
||||
else
|
||||
Decl :=
|
||||
Make_Object_Renaming_Declaration (Loc,
|
||||
Defining_Identifier => New_F,
|
||||
Subtype_Mark => New_Reference_To (Etype (Formal), Loc),
|
||||
Name =>
|
||||
Make_Explicit_Dereference (Loc, Renamed_Formal));
|
||||
end if;
|
||||
|
||||
return Decl;
|
||||
end Build_Renamed_Formal_Declaration;
|
||||
|
||||
-----------------------
|
||||
-- Build_PPC_Wrapper --
|
||||
-----------------------
|
||||
@ -4965,10 +5017,11 @@ package body Exp_Ch9 is
|
||||
and then Present (Handled_Statement_Sequence (N))
|
||||
then
|
||||
declare
|
||||
Comp : Entity_Id;
|
||||
Decl : Node_Id;
|
||||
Formal : Entity_Id;
|
||||
New_F : Entity_Id;
|
||||
Comp : Entity_Id;
|
||||
Decl : Node_Id;
|
||||
Formal : Entity_Id;
|
||||
New_F : Entity_Id;
|
||||
Renamed_Formal : Node_Id;
|
||||
|
||||
begin
|
||||
Push_Scope (Ent);
|
||||
@ -4997,21 +5050,18 @@ package body Exp_Ch9 is
|
||||
|
||||
Set_Actual_Subtype (New_F, Actual_Subtype (Formal));
|
||||
|
||||
Renamed_Formal :=
|
||||
Make_Selected_Component (Loc,
|
||||
Prefix =>
|
||||
Unchecked_Convert_To (
|
||||
Entry_Parameters_Type (Ent),
|
||||
New_Reference_To (Ann, Loc)),
|
||||
Selector_Name =>
|
||||
New_Reference_To (Comp, Loc));
|
||||
|
||||
Decl :=
|
||||
Make_Object_Renaming_Declaration (Loc,
|
||||
Defining_Identifier =>
|
||||
New_F,
|
||||
Subtype_Mark =>
|
||||
New_Reference_To (Etype (Formal), Loc),
|
||||
Name =>
|
||||
Make_Explicit_Dereference (Loc,
|
||||
Make_Selected_Component (Loc,
|
||||
Prefix =>
|
||||
Unchecked_Convert_To (
|
||||
Entry_Parameters_Type (Ent),
|
||||
New_Reference_To (Ann, Loc)),
|
||||
Selector_Name =>
|
||||
New_Reference_To (Comp, Loc))));
|
||||
Build_Renamed_Formal_Declaration
|
||||
(New_F, Formal, Comp, Renamed_Formal);
|
||||
|
||||
if No (Declarations (N)) then
|
||||
Set_Declarations (N, New_List);
|
||||
|
Loading…
Reference in New Issue
Block a user