[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 1 Aug 2014 14:37:00 +0000 (16:37 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 1 Aug 2014 14:37:00 +0000 (16:37 +0200)
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

gcc/ada/ChangeLog
gcc/ada/exp_intr.adb
gcc/ada/exp_util.adb
gcc/ada/exp_util.ads
gcc/ada/opt.ads
gcc/ada/sem_ch8.adb

index c4654d130cd010aa56882e9e833170e63a3c5daa..c490774ba23e0bb259eb529b81395905cc13c05a 100644 (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.
index a2d02e8a16f6919c59684097c68e2ec8f9be7d67..465c8b2f91daadbacedabaac43dbf9d54afbdf5d 100644 (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);
index 235951ebca3229f8b82466819e3a80f92a8221d1..64523f2e4c6f18e38bc2d1f10d2558676a7a243c 100644 (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
index 0483f8f31f15c3aa7b9c4846085db57100b01a04..a62ca9f101e4ac5439c59fb2b192f177ec2d64e9 100644 (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
index 2e7636dc6bab670b572eaa88f4c48a0d247d4b0a..f056f3985d163db4860f6a5cc1b76ecf3390f445 100644 (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)
 
index 0e5c2e4e50fa17375ae820c3e38ece5a1e271d7e..4a5bafcbc8cb1d8b535bad0f1f008296baeba78d 100644 (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;