exp_ch7.adb, [...] (Make_Temporary): Utility to create a defining identifier and link it to the expression whose...

2009-07-13  Ed Schonberg  <schonberg@adacore.com>

	* exp_ch7.adb, exp_util.adb, tbuild.adb, tbuild.ads, exp_ch4.adb,
	exp_aggr.adb (Make_Temporary): Utility to create a defining identifier
	and link it to the expression whose value it captures.

From-SVN: r149585
This commit is contained in:
Ed Schonberg 2009-07-13 13:21:47 +00:00 committed by Arnaud Charlet
parent a7209434bd
commit ae525aa88f
7 changed files with 41 additions and 35 deletions

View File

@ -1,3 +1,9 @@
2009-07-13 Ed Schonberg <schonberg@adacore.com>
* exp_ch7.adb, exp_util.adb, tbuild.adb, tbuild.ads, exp_ch4.adb,
exp_aggr.adb (Make_Temporary): Utility to create a defining identifier
and link it to the expression whose value it captures.
2009-07-13 Robert Dewar <dewar@adacore.com>
* output.adb: Minor comment addition for last change

View File

@ -2996,13 +2996,11 @@ package body Exp_Aggr is
-- will be used to capture the aggregate assignments.
TmpE : constant Entity_Id :=
Make_Defining_Identifier (Loc,
New_Internal_Name ('A'));
Make_Temporary (Loc, New_Internal_Name ('A'), N);
TmpD : constant Node_Id :=
Make_Object_Declaration (Loc,
Defining_Identifier =>
TmpE,
Defining_Identifier => TmpE,
Object_Definition =>
New_Reference_To (SubE, Loc));
@ -3588,7 +3586,7 @@ package body Exp_Aggr is
Rewrite (Parent (N), Make_Null_Statement (Loc));
else
Temp := Make_Defining_Identifier (Loc, New_Internal_Name ('A'));
Temp := Make_Temporary (Loc, New_Internal_Name ('A'), N);
-- If the type inherits unknown discriminants, use the view with
-- known discriminants if available.
@ -5203,7 +5201,7 @@ package body Exp_Aggr is
else
Maybe_In_Place_OK := False;
Tmp := Make_Defining_Identifier (Loc, New_Internal_Name ('A'));
Tmp := Make_Temporary (Loc, New_Internal_Name ('A'), N);
Tmp_Decl :=
Make_Object_Declaration
(Loc,

View File

@ -4043,7 +4043,7 @@ package body Exp_Ch4 is
-- and replace the conditional expresion by a reference to Cnn.all ???
if Present (Then_Actions (N)) or else Present (Else_Actions (N)) then
Cnn := Make_Defining_Identifier (Loc, New_Internal_Name ('C'));
Cnn := Make_Temporary (Loc, New_Internal_Name ('C'), N);
New_If :=
Make_Implicit_If_Statement (N,
@ -4092,10 +4092,6 @@ package body Exp_Ch4 is
Insert_Action (N, New_If);
Analyze_And_Resolve (N, Typ);
-- Link temporary to original expression, for CodePeer
Set_Related_Expression (Cnn, Original_Node (N));
end if;
end Expand_N_Conditional_Expression;

View File

@ -3552,14 +3552,10 @@ package body Exp_Ch7 is
procedure Wrap_Transient_Expression (N : Node_Id) is
Loc : constant Source_Ptr := Sloc (N);
E : constant Entity_Id :=
Make_Defining_Identifier (Loc, New_Internal_Name ('E'));
Make_Temporary (Loc, New_Internal_Name ('E'), N);
Etyp : constant Entity_Id := Etype (N);
begin
-- Indicate the origin of the temporary, for better reports
-- in CodePeer.
Set_Related_Expression (E, N);
Insert_Actions (N, New_List (
Make_Object_Declaration (Loc,
Defining_Identifier => E,

View File

@ -4588,7 +4588,7 @@ package body Exp_Util is
or else Nkind (Exp) in N_Op
or else (not Name_Req and then Is_Volatile_Reference (Exp)))
then
Def_Id := Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
Def_Id := Make_Temporary (Loc, New_Internal_Name ('R'), Exp);
Set_Etype (Def_Id, Exp_Type);
Res := New_Reference_To (Def_Id, Loc);
@ -4601,14 +4601,12 @@ package body Exp_Util is
Set_Assignment_OK (E);
Insert_Action (Exp, E);
Set_Related_Expression (Def_Id, Exp);
-- If the expression has the form v.all then we can just capture
-- the pointer, and then do an explicit dereference on the result.
elsif Nkind (Exp) = N_Explicit_Dereference then
Def_Id :=
Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
Def_Id := Make_Temporary (Loc, New_Internal_Name ('R'), Exp);
Res :=
Make_Explicit_Dereference (Loc, New_Reference_To (Def_Id, Loc));
@ -4619,7 +4617,6 @@ package body Exp_Util is
New_Reference_To (Etype (Prefix (Exp)), Loc),
Constant_Present => True,
Expression => Relocate_Node (Prefix (Exp))));
Set_Related_Expression (Def_Id, Exp);
-- Similar processing for an unchecked conversion of an expression
-- of the form v.all, where we want the same kind of treatment.
@ -4653,7 +4650,7 @@ package body Exp_Util is
-- Use a renaming to capture the expression, rather than create
-- a controlled temporary.
Def_Id := Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
Def_Id := Make_Temporary (Loc, New_Internal_Name ('R'), Exp);
Res := New_Reference_To (Def_Id, Loc);
Insert_Action (Exp,
@ -4661,10 +4658,9 @@ package body Exp_Util is
Defining_Identifier => Def_Id,
Subtype_Mark => New_Reference_To (Exp_Type, Loc),
Name => Relocate_Node (Exp)));
Set_Related_Expression (Def_Id, Exp);
else
Def_Id := Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
Def_Id := Make_Temporary (Loc, New_Internal_Name ('R'), Exp);
Set_Etype (Def_Id, Exp_Type);
Res := New_Reference_To (Def_Id, Loc);
@ -4677,7 +4673,6 @@ package body Exp_Util is
Set_Assignment_OK (E);
Insert_Action (Exp, E);
Set_Related_Expression (Def_Id, Exp);
end if;
-- For expressions that denote objects, we can use a renaming scheme.
@ -4688,7 +4683,7 @@ package body Exp_Util is
and then Nkind (Exp) /= N_Function_Call
and then (Name_Req or else not Is_Volatile_Reference (Exp))
then
Def_Id := Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
Def_Id := Make_Temporary (Loc, New_Internal_Name ('R'), Exp);
if Nkind (Exp) = N_Selected_Component
and then Nkind (Prefix (Exp)) = N_Function_Call
@ -4721,8 +4716,6 @@ package body Exp_Util is
Name => Relocate_Node (Exp)));
end if;
Set_Related_Expression (Def_Id, Exp);
-- If this is a packed reference, or a selected component with a
-- non-standard representation, a reference to the temporary will
-- be replaced by a copy of the original expression (see
@ -4758,8 +4751,7 @@ package body Exp_Util is
then
declare
Obj : constant Entity_Id :=
Make_Defining_Identifier (Loc,
Chars => New_Internal_Name ('F'));
Make_Temporary (Loc, New_Internal_Name ('F'), Exp);
Decl : Node_Id;
begin
@ -4770,7 +4762,6 @@ package body Exp_Util is
Expression => Relocate_Node (Exp));
Insert_Action (Exp, Decl);
Set_Etype (Obj, Exp_Type);
Set_Related_Expression (Obj, Exp);
Rewrite (Exp, New_Occurrence_Of (Obj, Loc));
return;
end;
@ -4790,7 +4781,7 @@ package body Exp_Util is
E := Exp;
Insert_Action (Exp, Ptr_Typ_Decl);
Def_Id := Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
Def_Id := Make_Temporary (Loc, New_Internal_Name ('R'), Exp);
Set_Etype (Def_Id, Exp_Type);
Res :=
@ -4828,7 +4819,6 @@ package body Exp_Util is
Defining_Identifier => Def_Id,
Object_Definition => New_Reference_To (Ref_Type, Loc),
Expression => New_Exp));
Set_Related_Expression (Def_Id, Exp);
end if;
-- Preserve the Assignment_OK flag in all copies, since at least

View File

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2008, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -436,6 +436,18 @@ package body Tbuild is
Strval => End_String);
end Make_String_Literal;
function Make_Temporary
(Loc : Source_Ptr;
Id : Name_Id;
Related_Node : Node_Id := Empty) return Node_Id
is
Temp : Node_Id;
begin
Temp := Make_Defining_Identifier (Loc, Id);
Set_Related_Expression (Temp, Related_Node);
return Temp;
end Make_Temporary;
---------------------------
-- Make_Unsuppress_Block --
---------------------------

View File

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2008, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -175,6 +175,14 @@ package Tbuild is
-- A convenient form of Make_String_Literal, where the string value
-- is given as a normal string instead of a String_Id value.
function Make_Temporary
(Loc : Source_Ptr;
Id : Name_Id;
Related_Node : Node_Id := Empty) return Node_Id;
-- Create a defining identifier to capture the value of an expression
-- or aggregate, and link it to the expression that it replaces, in
-- order to provide better CodePeer reports.
function Make_Unsuppress_Block
(Loc : Source_Ptr;
Check : Name_Id;