Commit cd5acda5 by Yannick Moy Committed by Arnaud Charlet

exp_util.ads, [...] (Evaluate_Name): Force evaluation of expression being qualified...

2017-04-27  Yannick Moy  <moy@adacore.com>

	* exp_util.ads, exp_util.adb (Evaluate_Name): Force evaluation
	of expression being qualified, when not an object name, or else
	evaluate the underlying name.

From-SVN: r247311
parent 7e6060af
2017-04-27 Yannick Moy <moy@adacore.com>
* exp_util.ads, exp_util.adb (Evaluate_Name): Force evaluation
of expression being qualified, when not an object name, or else
evaluate the underlying name.
2017-04-27 Jerome Lambourg <lambourg@adacore.com> 2017-04-27 Jerome Lambourg <lambourg@adacore.com>
* bindusg.adb, bindgen.adb, gnatbind.adb, opt.ads: add -nognarl switch. * bindusg.adb, bindgen.adb, gnatbind.adb, opt.ads: add -nognarl switch.
......
...@@ -4724,27 +4724,15 @@ package body Exp_Util is ...@@ -4724,27 +4724,15 @@ package body Exp_Util is
------------------- -------------------
procedure Evaluate_Name (Nam : Node_Id) is procedure Evaluate_Name (Nam : Node_Id) is
K : constant Node_Kind := Nkind (Nam);
begin begin
-- For an explicit dereference, we simply force the evaluation of the -- For an attribute reference or an indexed component, evaluate the
-- name expression. The dereference provides a value that is the address
-- for the renamed object, and it is precisely this value that we want
-- to preserve.
if K = N_Explicit_Dereference then
Force_Evaluation (Prefix (Nam));
-- For a selected component, we simply evaluate the prefix
elsif K = N_Selected_Component then
Evaluate_Name (Prefix (Nam));
-- For an indexed component, or an attribute reference, we evaluate the
-- prefix, which is itself a name, recursively, and then force the -- prefix, which is itself a name, recursively, and then force the
-- evaluation of all the subscripts (or attribute expressions). -- evaluation of all the subscripts (or attribute expressions).
elsif Nkind_In (K, N_Indexed_Component, N_Attribute_Reference) then case Nkind (Nam) is
when N_Attribute_Reference
| N_Indexed_Component
=>
Evaluate_Name (Prefix (Nam)); Evaluate_Name (Prefix (Nam));
declare declare
...@@ -4756,40 +4744,65 @@ package body Exp_Util is ...@@ -4756,40 +4744,65 @@ package body Exp_Util is
Force_Evaluation (E); Force_Evaluation (E);
if Original_Node (E) /= E then if Original_Node (E) /= E then
Set_Do_Range_Check (E, Do_Range_Check (Original_Node (E))); Set_Do_Range_Check (E,
Do_Range_Check (Original_Node (E)));
end if; end if;
Next (E); Next (E);
end loop; end loop;
end; end;
-- For an explicit dereference, we simply force the evaluation of
-- the name expression. The dereference provides a value that is the
-- address for the renamed object, and it is precisely this value
-- that we want to preserve.
when N_Explicit_Dereference =>
Force_Evaluation (Prefix (Nam));
-- For a function call, we evaluate the call
when N_Function_Call =>
Force_Evaluation (Nam);
-- For a qualified expression, we evaluate the underlying object
-- name if any, otherwise we force the evaluation of the underlying
-- expression.
when N_Qualified_Expression =>
if Is_Object_Reference (Expression (Nam)) then
Evaluate_Name (Expression (Nam));
else
Force_Evaluation (Expression (Nam));
end if;
-- For a selected component, we simply evaluate the prefix
when N_Selected_Component =>
Evaluate_Name (Prefix (Nam));
-- For a slice, we evaluate the prefix, as for the indexed component -- For a slice, we evaluate the prefix, as for the indexed component
-- case and then, if there is a range present, either directly or as the -- case and then, if there is a range present, either directly or as
-- constraint of a discrete subtype indication, we evaluate the two -- the constraint of a discrete subtype indication, we evaluate the
-- bounds of this range. -- two bounds of this range.
elsif K = N_Slice then when N_Slice =>
Evaluate_Name (Prefix (Nam)); Evaluate_Name (Prefix (Nam));
Evaluate_Slice_Bounds (Nam); Evaluate_Slice_Bounds (Nam);
-- For a type conversion, the expression of the conversion must be the -- For a type conversion, the expression of the conversion must be
-- name of an object, and we simply need to evaluate this name. -- the name of an object, and we simply need to evaluate this name.
elsif K = N_Type_Conversion then when N_Type_Conversion =>
Evaluate_Name (Expression (Nam)); Evaluate_Name (Expression (Nam));
-- For a function call, we evaluate the call
elsif K = N_Function_Call then
Force_Evaluation (Nam);
-- The remaining cases are direct name, operator symbol and character -- The remaining cases are direct name, operator symbol and character
-- literal. In all these cases, we do nothing, since we want to -- literal. In all these cases, we do nothing, since we want to
-- reevaluate each time the renamed object is used. -- reevaluate each time the renamed object is used.
else when others =>
return; null;
end if; end case;
end Evaluate_Name; end Evaluate_Name;
--------------------------- ---------------------------
...@@ -6933,7 +6946,7 @@ package body Exp_Util is ...@@ -6933,7 +6946,7 @@ package body Exp_Util is
-- existing actions of the expression with actions, and should -- existing actions of the expression with actions, and should
-- never reach here: if actions are inserted on a statement -- never reach here: if actions are inserted on a statement
-- within the Actions of an expression with actions, or on some -- within the Actions of an expression with actions, or on some
-- sub-expression of such a statement, then the outermost proper -- subexpression of such a statement, then the outermost proper
-- insertion point is right before the statement, and we should -- insertion point is right before the statement, and we should
-- never climb up as far as the N_Expression_With_Actions itself. -- never climb up as far as the N_Expression_With_Actions itself.
......
...@@ -518,8 +518,11 @@ package Exp_Util is ...@@ -518,8 +518,11 @@ package Exp_Util is
procedure Evaluate_Name (Nam : Node_Id); procedure Evaluate_Name (Nam : Node_Id);
-- Remove all side effects from a name which appears as part of an object -- Remove all side effects from a name which appears as part of an object
-- renaming declaration. More comments are needed here that explain how -- renaming declaration. Similarly to Force_Evaluation, it removes the
-- this differs from Force_Evaluation and Remove_Side_Effects ??? -- side effects and captures the values of the variables, except for the
-- variable being renamed. Hence this differs from Force_Evaluation and
-- Remove_Side_Effects (but it calls Force_Evaluation on subexpressions
-- whose value needs to be fixed).
procedure Evolve_And_Then (Cond : in out Node_Id; Cond1 : Node_Id); procedure Evolve_And_Then (Cond : in out Node_Id; Cond1 : Node_Id);
-- Rewrites Cond with the expression: Cond and then Cond1. If Cond is -- Rewrites Cond with the expression: Cond and then Cond1. If Cond is
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment