summaryrefslogtreecommitdiff
path: root/gcc/ada/exp_ch2.adb
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-31 17:54:05 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-31 17:54:05 +0000
commitda014f2c6153272e08c8aa85cc3aeff4d76af78e (patch)
treeb47410ea0b42b438ed8b2e9adad8dbdf13a7e102 /gcc/ada/exp_ch2.adb
parent7f8eb6ed90e65b94be40417dd42864036d1601b0 (diff)
downloadgcc-da014f2c6153272e08c8aa85cc3aeff4d76af78e.tar.gz
2006-10-31 Robert Dewar <dewar@adacore.com>
* exp_ch2.adb: Change Is_Lvalue to May_Be_Lvalue (Expand_Entity_Reference): Correct error of not handling subprogram formals in current_value processing. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118255 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/exp_ch2.adb')
-rw-r--r--gcc/ada/exp_ch2.adb57
1 files changed, 42 insertions, 15 deletions
diff --git a/gcc/ada/exp_ch2.adb b/gcc/ada/exp_ch2.adb
index 255c0db7fb9..291d172a42e 100644
--- a/gcc/ada/exp_ch2.adb
+++ b/gcc/ada/exp_ch2.adb
@@ -77,6 +77,7 @@ package body Exp_Ch2 is
procedure Expand_Entity_Reference (N : Node_Id);
-- Common processing for expansion of identifiers and expanded names
+ -- Dispatches to specific expansion procedures.
procedure Expand_Entry_Index_Parameter (N : Node_Id);
-- A reference to the identifier in the entry index specification of
@@ -93,19 +94,20 @@ package body Exp_Ch2 is
procedure Expand_Formal (N : Node_Id);
-- A reference to a formal parameter of a protected subprogram is expanded
- -- to the corresponding formal of the unprotected procedure used to
- -- represent the protected subprogram within the protected object.
+ -- into the corresponding formal of the unprotected procedure used to
+ -- represent the operation within the protected object. In other cases
+ -- Expand_Formal is a noop.
procedure Expand_Protected_Private (N : Node_Id);
- -- A reference to a private object of a protected type is expanded to a
+ -- A reference to a private component of a protected type is expanded to a
-- component selected from the record used to implement the protected
-- object. Such a record is passed to all operations on a protected object
- -- in a parameter named _object. Such an object is a constant within a
- -- function, and a variable otherwise.
+ -- in a parameter named _object. This object is a constant in the body of a
+ -- function, and a variable within a procedure or entry body.
procedure Expand_Renaming (N : Node_Id);
-- For renamings, just replace the identifier by the corresponding
- -- name expression. Note that this has been evaluated (see routine
+ -- named expression. Note that this has been evaluated (see routine
-- Exp_Ch8.Expand_N_Object_Renaming.Evaluate_Name) so this gives
-- the correct renaming semantics.
@@ -141,7 +143,7 @@ package body Exp_Ch2 is
-- Do not replace lvalues
- and then not Is_Lvalue (N)
+ and then not May_Be_Lvalue (N)
-- Check that entity is suitable for replacement
@@ -348,12 +350,15 @@ package body Exp_Ch2 is
and then Is_Shared_Passive (E)
then
Expand_Shared_Passive_Variable (N);
+ end if;
- elsif (Ekind (E) = E_Variable
- or else
- Ekind (E) = E_In_Out_Parameter
- or else
- Ekind (E) = E_Out_Parameter)
+ -- Interpret possible Current_Value for variable case
+
+ if (Ekind (E) = E_Variable
+ or else
+ Ekind (E) = E_In_Out_Parameter
+ or else
+ Ekind (E) = E_Out_Parameter)
and then Present (Current_Value (E))
then
Expand_Current_Value (N);
@@ -364,6 +369,24 @@ package body Exp_Ch2 is
if Is_Boolean_Type (Etype (N)) then
Warn_On_Known_Condition (N);
end if;
+
+ -- Don't mess with Current_Value for compile time known values. Not
+ -- only is it unnecessary, but we could disturb an indication of a
+ -- static value, which could cause semantic trouble.
+
+ elsif Compile_Time_Known_Value (N) then
+ null;
+
+ -- Interpret possible Current_Value for constant case
+
+ elsif (Ekind (E) = E_Constant
+ or else
+ Ekind (E) = E_In_Parameter
+ or else
+ Ekind (E) = E_Loop_Parameter)
+ and then Present (Current_Value (E))
+ then
+ Expand_Current_Value (N);
end if;
end Expand_Entity_Reference;
@@ -477,11 +500,15 @@ package body Exp_Ch2 is
procedure Expand_Formal (N : Node_Id) is
E : constant Entity_Id := Entity (N);
- Subp : constant Entity_Id := Scope (E);
+ Scop : constant Entity_Id := Scope (E);
begin
- if Is_Protected_Type (Scope (Subp))
- and then not Is_Init_Proc (Subp)
+ -- Check whether the subprogram of which this is a formal is
+ -- a protected operation. The initialization procedure for
+ -- the corresponding record type is not itself a protected operation.
+
+ if Is_Protected_Type (Scope (Scop))
+ and then not Is_Init_Proc (Scop)
and then Present (Protected_Formal (E))
then
Set_Entity (N, Protected_Formal (E));