[multiple changes]

2014-08-01  Robert Dewar  <dewar@adacore.com>

	* sem_ch8.adb, opt.ads Minor comment updates.

2014-08-01  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_intr.adb (Expand_Unc_Deallocation): Request a renaming
	from the side effects removal machinery.
	* exp_util.adb (Duplicate_Subexpr): Add formal parameter
	Renaming_Req. Update the nested call to Remove_Side_Effects.
	(Duplicate_Subexpr_No_Checks): Add formal parameter
	Renaming_Req. Update the nested call to Remove_Side_Effects.
	(Duplicate_Subexpr_Move_Checks): Add formal parameter
	Renaming_Req. Update the nested call to Remove_Side_Effects.
	(Remove_Side_Effects): Add formal parameter Renaming_Req. Generate
	an object renaming declaration when the caller requests it.
	* exp_util.ads (Duplicate_Subexpr): Add formal
	parameter Renaming_Req. Update comment on usage.
	(Duplicate_Subexpr_No_Checks): Add formal parameter Renaming_Req.
	(Duplicate_Subexpr_Move_Checks): Add formal parameter
	Renaming_Req.

From-SVN: r213480
This commit is contained in:
Arnaud Charlet 2014-08-01 16:37:00 +02:00
parent bdc193bad1
commit a43f6434db
6 changed files with 111 additions and 44 deletions

View File

@ -1,3 +1,25 @@
2014-08-01 Robert Dewar <dewar@adacore.com>
* sem_ch8.adb, opt.ads Minor comment updates.
2014-08-01 Hristian Kirtchev <kirtchev@adacore.com>
* exp_intr.adb (Expand_Unc_Deallocation): Request a renaming
from the side effects removal machinery.
* exp_util.adb (Duplicate_Subexpr): Add formal parameter
Renaming_Req. Update the nested call to Remove_Side_Effects.
(Duplicate_Subexpr_No_Checks): Add formal parameter
Renaming_Req. Update the nested call to Remove_Side_Effects.
(Duplicate_Subexpr_Move_Checks): Add formal parameter
Renaming_Req. Update the nested call to Remove_Side_Effects.
(Remove_Side_Effects): Add formal parameter Renaming_Req. Generate
an object renaming declaration when the caller requests it.
* exp_util.ads (Duplicate_Subexpr): Add formal
parameter Renaming_Req. Update comment on usage.
(Duplicate_Subexpr_No_Checks): Add formal parameter Renaming_Req.
(Duplicate_Subexpr_Move_Checks): Add formal parameter
Renaming_Req.
2014-08-01 Bob Duff <duff@adacore.com>
* gnat_ugn.texi: Minor updates.

View File

@ -1106,9 +1106,11 @@ package body Exp_Intr is
end if;
end if;
-- Normal processing for non-controlled types
-- Normal processing for non-controlled types. The argument to free is
-- a renaming rather than a constant to ensure that the original context
-- is always set to null after the deallocation takes place.
Free_Arg := Duplicate_Subexpr_No_Checks (Arg);
Free_Arg := Duplicate_Subexpr_No_Checks (Arg, Renaming_Req => True);
Free_Node := Make_Free_Statement (Loc, Empty);
Append_To (Stmts, Free_Node);
Set_Storage_Pool (Free_Node, Pool);

View File

@ -1791,11 +1791,12 @@ package body Exp_Util is
-----------------------
function Duplicate_Subexpr
(Exp : Node_Id;
Name_Req : Boolean := False) return Node_Id
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False) return Node_Id
is
begin
Remove_Side_Effects (Exp, Name_Req);
Remove_Side_Effects (Exp, Name_Req, Renaming_Req);
return New_Copy_Tree (Exp);
end Duplicate_Subexpr;
@ -1804,12 +1805,14 @@ package body Exp_Util is
---------------------------------
function Duplicate_Subexpr_No_Checks
(Exp : Node_Id;
Name_Req : Boolean := False) return Node_Id
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False) return Node_Id
is
New_Exp : Node_Id;
begin
Remove_Side_Effects (Exp, Name_Req);
Remove_Side_Effects (Exp, Name_Req, Renaming_Req);
New_Exp := New_Copy_Tree (Exp);
Remove_Checks (New_Exp);
return New_Exp;
@ -1820,12 +1823,14 @@ package body Exp_Util is
-----------------------------------
function Duplicate_Subexpr_Move_Checks
(Exp : Node_Id;
Name_Req : Boolean := False) return Node_Id
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False) return Node_Id
is
New_Exp : Node_Id;
begin
Remove_Side_Effects (Exp, Name_Req);
Remove_Side_Effects (Exp, Name_Req, Renaming_Req);
New_Exp := New_Copy_Tree (Exp);
Remove_Checks (Exp);
return New_Exp;
@ -7101,6 +7106,7 @@ package body Exp_Util is
procedure Remove_Side_Effects
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False;
Variable_Ref : Boolean := False)
is
Loc : constant Source_Ptr := Sloc (Exp);
@ -7186,14 +7192,30 @@ package body Exp_Util is
Set_Analyzed (Prefix (Exp), False);
end if;
E :=
Make_Object_Declaration (Loc,
Defining_Identifier => Def_Id,
Object_Definition => New_Occurrence_Of (Exp_Type, Loc),
Constant_Present => True,
Expression => Relocate_Node (Exp));
-- Generate:
-- Rnn : Exp_Type renames Expr;
if Renaming_Req then
E :=
Make_Object_Renaming_Declaration (Loc,
Defining_Identifier => Def_Id,
Subtype_Mark => New_Occurrence_Of (Exp_Type, Loc),
Name => Relocate_Node (Exp));
-- Generate:
-- Rnn : constant Exp_Type := Expr;
else
E :=
Make_Object_Declaration (Loc,
Defining_Identifier => Def_Id,
Object_Definition => New_Occurrence_Of (Exp_Type, Loc),
Constant_Present => True,
Expression => Relocate_Node (Exp));
Set_Assignment_OK (E);
end if;
Set_Assignment_OK (E);
Insert_Action (Exp, E);
-- If the expression has the form v.all then we can just capture the

View File

@ -330,8 +330,9 @@ package Exp_Util is
-- be the earliest point at which they are used.
function Duplicate_Subexpr
(Exp : Node_Id;
Name_Req : Boolean := False) return Node_Id;
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False) return Node_Id;
-- Given the node for a subexpression, this function makes a logical copy
-- of the subexpression, and returns it. This is intended for use when the
-- expansion of an expression needs to repeat part of it. For example,
@ -343,17 +344,25 @@ package Exp_Util is
-- expression and the returned result then become references to this saved
-- value. Exp must be analyzed on entry. On return, Exp is analyzed, but
-- the caller is responsible for analyzing the returned copy after it is
-- attached to the tree. The Name_Req flag is set to ensure that the result
-- is suitable for use in a context requiring name (e.g. the prefix of an
-- attribute reference).
-- attached to the tree.
--
-- The Name_Req flag is set to ensure that the result is suitable for use
-- in a context requiring a name (for example, the prefix of an attribute
-- reference) (can't this just be a qualification in Ada 2012???).
--
-- The Renaming_Req flag is set to produce an object renaming declaration
-- rather than an object declaration. This is valid only if the expression
-- Exp designates a renamable object. This is used for example in the case
-- of an unchecked deallocation, to make sure the object gets set to null.
--
-- Note that if there are any run time checks in Exp, these same checks
-- will be duplicated in the returned duplicated expression. The two
-- following functions allow this behavior to be modified.
function Duplicate_Subexpr_No_Checks
(Exp : Node_Id;
Name_Req : Boolean := False) return Node_Id;
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False) return Node_Id;
-- Identical in effect to Duplicate_Subexpr, except that Remove_Checks
-- is called on the result, so that the duplicated expression does not
-- include checks. This is appropriate for use when Exp, the original
@ -361,8 +370,9 @@ package Exp_Util is
-- expression, so that there is no need to repeat any checks.
function Duplicate_Subexpr_Move_Checks
(Exp : Node_Id;
Name_Req : Boolean := False) return Node_Id;
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False) return Node_Id;
-- Identical in effect to Duplicate_Subexpr, except that Remove_Checks is
-- called on Exp after the duplication is complete, so that the original
-- expression does not include checks. In this case the result returned
@ -808,6 +818,7 @@ package Exp_Util is
procedure Remove_Side_Effects
(Exp : Node_Id;
Name_Req : Boolean := False;
Renaming_Req : Boolean := False;
Variable_Ref : Boolean := False);
-- Given the node for a subexpression, this function replaces the node if
-- necessary by an equivalent subexpression that is guaranteed to be side
@ -816,10 +827,12 @@ package Exp_Util is
-- to which Exp is attached. Exp must be analyzed and resolved before the
-- call and is analyzed and resolved on return. Name_Req may only be set to
-- True if Exp has the form of a name, and the effect is to guarantee that
-- any replacement maintains the form of name. If Variable_Ref is set to
-- TRUE, a variable is considered as side effect (used in implementing
-- Force_Evaluation). Note: after call to Remove_Side_Effects, it is
-- safe to call New_Copy_Tree to obtain a copy of the resulting expression.
-- any replacement maintains the form of name. If Renaming_Req is set to
-- TRUE, the routine produces an object renaming reclaration capturing the
-- expression. If Variable_Ref is set to TRUE, a variable is considered as
-- side effect (used in implementing Force_Evaluation). Note: after call to
-- Remove_Side_Effects, it is safe to call New_Copy_Tree to obtain a copy
-- of the resulting expression.
function Represented_As_Scalar (T : Entity_Id) return Boolean;
-- Returns True iff the implementation of this type in code generation

View File

@ -2097,7 +2097,12 @@ package Opt is
-- GNAT
-- True if compiling in GNAT system mode (-gnatg switch)
-- Setting this switch has the following effects
-- Setting this switch has the following effects on the language that is
-- accepted. Note that several of the following have the effect of changing
-- an error to a warning. But warnings are usually treated as fatal errors
-- in -gnatg mode, so to actually take advantage of such a change, it is
-- necessary to add an explicit pragma Warnings (Off) in the source and
-- this requires clear documentation of why this is necessary.
-- The identifier character set is set to 'n' (7-bit ASCII)
@ -2141,13 +2146,11 @@ package Opt is
-- Returning objects of limited types is allowed
-- All entities are considered known to Known_But_Invisible
-- Non-static call in preelaborated unit give a warning, not an error
-- Warnings on possible elaboration errors are suppressed
-- Warning about packing being ignored is suppressed
-- Warnings about packing being ignored are suppressed
-- Warnings in internal units are not suppressed (they normally are)

View File

@ -4462,14 +4462,14 @@ package body Sem_Ch8 is
-- for that processing
function Known_But_Invisible (E : Entity_Id) return Boolean;
-- This function determines whether the entity E (which is not
-- visible) can reasonably be considered to be known to the writer
-- of the reference. This is a heuristic test, used only for the
-- purposes of figuring out whether we prefer to complain that an
-- entity is undefined or invisible (and identify the declaration
-- of the invisible entity in the latter case). The point here is
-- that we don't want to complain that something is invisible and
-- then point to something entirely mysterious to the writer.
-- This function determines whether a reference to the entity E, which
-- is not visible, can reasonably be considered to be known to the
-- writer of the reference. This is a heuristic test, used only for
-- the purposes of figuring out whether we prefer to complain that an
-- entity is undefined or invisible (and identify the declaration of
-- the invisible entity in the latter case). The point here is that we
-- don't want to complain that something is invisible and then point to
-- something entirely mysterious to the writer.
procedure Nvis_Messages;
-- Called if there are no visible entries for N, but there is at least
@ -4608,7 +4608,12 @@ package body Sem_Ch8 is
elsif not Comes_From_Source (E) then
return False;
-- In gnat internal mode, we consider all entities known
-- In gnat internal mode, we consider all entities known. The
-- historical reason behind this discrepancy is not known??? But the
-- only effect is to modify the error message given, so it is not
-- critical. Since it only affects the exact wording of error
-- messages in illegal programs, we do not mention this as an
-- effect of -gnatg, since it is not a language modification.
elsif GNAT_Mode then
return True;