exp_ch6.adb (Make_Build_In_Place_Call_In_Assignment): Declare NEW_EXPR local variable...
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 20 Nov 2011 11:41:57 +0000 (11:41 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Sun, 20 Nov 2011 11:41:57 +0000 (12:41 +0100)
2011-11-20  Eric Botcazou  <ebotcazou@adacore.com>

* exp_ch6.adb (Make_Build_In_Place_Call_In_Assignment):
Declare NEW_EXPR local variable and attach the
temporary to it.  Set Is_Known_Non_Null on the temporary.
(Make_Build_In_Place_Call_In_Object_Declaration): Likewise.
* exp_util.adb (Remove_Side_Effects): Set Is_Known_Non_Null on
the temporary created to hold the 'Reference of the expression,
if any.
* checks.adb (Install_Null_Excluding_Check): Bail out for the
Get_Current_Excep.all.all idiom generated by the expander.

From-SVN: r181529

gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/exp_ch6.adb
gcc/ada/exp_util.adb

index e6bc5c7b835e1438825bca9540faa2b13f879371..35a2096ca37e3a82374a9ac4c18d68a401ce8aa7 100644 (file)
@@ -1,3 +1,15 @@
+2011-11-20  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_ch6.adb (Make_Build_In_Place_Call_In_Assignment):
+       Declare NEW_EXPR local variable and attach the
+       temporary to it.  Set Is_Known_Non_Null on the temporary.
+       (Make_Build_In_Place_Call_In_Object_Declaration): Likewise.
+       * exp_util.adb (Remove_Side_Effects): Set Is_Known_Non_Null on
+       the temporary created to hold the 'Reference of the expression,
+       if any.
+       * checks.adb (Install_Null_Excluding_Check): Bail out for the
+       Get_Current_Excep.all.all idiom generated by the expander.
+
 2011-11-20  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (struct language_function): Add GNAT_RET.
index 67febfe1919f9829768576c286a58d55ae355564..e6d8bf996efcb0fd7ce297fecfcc80da9421abb3 100644 (file)
@@ -5673,6 +5673,22 @@ package body Checks is
          return;
       end if;
 
+      --  No check needed for the Get_Current_Excep.all.all idiom generated by
+      --  the expander within exception handlers, since we know that the value
+      --  can never be null.
+
+      --  Is this really the right way to do this? Normally we generate such
+      --  code in the expander with checks off, and that's how we suppress this
+      --  kind of junk check ???
+
+      if Nkind (N) = N_Function_Call
+        and then Nkind (Name (N)) = N_Explicit_Dereference
+        and then Nkind (Prefix (Name (N))) = N_Identifier
+        and then Is_RTE (Entity (Prefix (Name (N))), RE_Get_Current_Excep)
+      then
+         return;
+      end if;
+
       --  Otherwise install access check
 
       Insert_Action (N,
index 6049c452cb8f3545672eb4a42f0220dc907cb53f..f3d915de74acdc7f7cce8686e87995310eabca76 100644 (file)
@@ -7954,6 +7954,7 @@ package body Exp_Ch6 is
       Obj_Id       : Entity_Id;
       Ptr_Typ      : Entity_Id;
       Ptr_Typ_Decl : Node_Id;
+      New_Expr     : Node_Id;
       Result_Subt  : Entity_Id;
       Target       : Node_Id;
 
@@ -8035,14 +8036,17 @@ package body Exp_Ch6 is
       --  Finally, create an access object initialized to a reference to the
       --  function call.
 
-      Obj_Id := Make_Temporary (Loc, 'R');
+      New_Expr := Make_Reference (Loc, Relocate_Node (Func_Call));
+
+      Obj_Id := Make_Temporary (Loc, 'R', New_Expr);
       Set_Etype (Obj_Id, Ptr_Typ);
+      Set_Is_Known_Non_Null (Obj_Id);
 
       Obj_Decl :=
         Make_Object_Declaration (Loc,
           Defining_Identifier => Obj_Id,
           Object_Definition   => New_Reference_To (Ptr_Typ, Loc),
-          Expression => Make_Reference (Loc, Relocate_Node (Func_Call)));
+          Expression          => New_Expr);
       Insert_After_And_Analyze (Ptr_Typ_Decl, Obj_Decl);
 
       Rewrite (Assign, Make_Null_Statement (Loc));
@@ -8301,6 +8305,7 @@ package body Exp_Ch6 is
 
       Def_Id := Make_Temporary (Loc, 'R', New_Expr);
       Set_Etype (Def_Id, Ref_Type);
+      Set_Is_Known_Non_Null (Def_Id);
 
       Insert_After_And_Analyze (Ptr_Typ_Decl,
         Make_Object_Declaration (Loc,
index e675da828890a2b59924ac4103c04e342dfa58ab..56a6f20ed1902bee90c72e6f3c69886fc9e6b16f 100644 (file)
@@ -6712,6 +6712,7 @@ package body Exp_Util is
                New_Exp := E;
             else
                New_Exp := Make_Reference (Loc, E);
+               Set_Is_Known_Non_Null (Def_Id);
             end if;
          end if;