Commit 74cab21a by Eric Botcazou Committed by Arnaud Charlet

exp_ch6.adb (Make_Build_In_Place_Call_In_Assignment): Declare NEW_EXPR local…

exp_ch6.adb (Make_Build_In_Place_Call_In_Assignment): Declare NEW_EXPR local variable and attach the temporary to it.

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
parent 088b91c7
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.
(f_gnat_ret): New macro.
(struct nrv_data): Add GNAT_RET.
......
......@@ -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,
......
......@@ -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,
......
......@@ -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;
......
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