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,72 +4724,85 @@ package body Exp_Util is ...@@ -4724,72 +4724,85 @@ 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 -- prefix, which is itself a name, recursively, and then force the
-- for the renamed object, and it is precisely this value that we want -- evaluation of all the subscripts (or attribute expressions).
-- to preserve.
if K = N_Explicit_Dereference then case Nkind (Nam) is
Force_Evaluation (Prefix (Nam)); when N_Attribute_Reference
| N_Indexed_Component
=>
Evaluate_Name (Prefix (Nam));
-- For a selected component, we simply evaluate the prefix declare
E : Node_Id;
elsif K = N_Selected_Component then begin
Evaluate_Name (Prefix (Nam)); E := First (Expressions (Nam));
while Present (E) loop
Force_Evaluation (E);
-- For an indexed component, or an attribute reference, we evaluate the if Original_Node (E) /= E then
-- prefix, which is itself a name, recursively, and then force the Set_Do_Range_Check (E,
-- evaluation of all the subscripts (or attribute expressions). Do_Range_Check (Original_Node (E)));
end if;
elsif Nkind_In (K, N_Indexed_Component, N_Attribute_Reference) then Next (E);
Evaluate_Name (Prefix (Nam)); end loop;
end;
declare -- For an explicit dereference, we simply force the evaluation of
E : Node_Id; -- 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.
begin when N_Explicit_Dereference =>
E := First (Expressions (Nam)); Force_Evaluation (Prefix (Nam));
while Present (E) loop
Force_Evaluation (E);
if Original_Node (E) /= E then -- For a function call, we evaluate the call
Set_Do_Range_Check (E, Do_Range_Check (Original_Node (E)));
end if;
Next (E); when N_Function_Call =>
end loop; Force_Evaluation (Nam);
end;
-- For a slice, we evaluate the prefix, as for the indexed component -- For a qualified expression, we evaluate the underlying object
-- case and then, if there is a range present, either directly or as the -- name if any, otherwise we force the evaluation of the underlying
-- constraint of a discrete subtype indication, we evaluate the two -- expression.
-- bounds of this range.
elsif K = N_Slice then when N_Qualified_Expression =>
Evaluate_Name (Prefix (Nam)); if Is_Object_Reference (Expression (Nam)) then
Evaluate_Slice_Bounds (Nam); Evaluate_Name (Expression (Nam));
else
Force_Evaluation (Expression (Nam));
end if;
-- For a type conversion, the expression of the conversion must be the -- For a selected component, we simply evaluate the prefix
-- name of an object, and we simply need to evaluate this name.
elsif K = N_Type_Conversion then when N_Selected_Component =>
Evaluate_Name (Expression (Nam)); Evaluate_Name (Prefix (Nam));
-- For a function call, we evaluate the call -- 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 constraint of a discrete subtype indication, we evaluate the
-- two bounds of this range.
elsif K = N_Function_Call then when N_Slice =>
Force_Evaluation (Nam); Evaluate_Name (Prefix (Nam));
Evaluate_Slice_Bounds (Nam);
-- The remaining cases are direct name, operator symbol and character -- For a type conversion, the expression of the conversion must be
-- literal. In all these cases, we do nothing, since we want to -- the name of an object, and we simply need to evaluate this name.
-- reevaluate each time the renamed object is used.
else when N_Type_Conversion =>
return; Evaluate_Name (Expression (Nam));
end if;
-- The remaining cases are direct name, operator symbol and character
-- literal. In all these cases, we do nothing, since we want to
-- reevaluate each time the renamed object is used.
when others =>
null;
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