trans.c (gnat_to_gnu): Really force evaluation of the expression...

* gcc-interface/trans.c (gnat_to_gnu) <N_Object_Declaration>: Really
	force evaluation of the expression, if any, when the object has its
	elaboration delayed.  Do not create a variable at global level.

From-SVN: r223716
This commit is contained in:
Eric Botcazou 2015-05-26 20:37:29 +00:00 committed by Eric Botcazou
parent c68cdfac5b
commit 545b492365
8 changed files with 83 additions and 22 deletions

View File

@ -1,3 +1,9 @@
2015-05-26 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (gnat_to_gnu) <N_Object_Declaration>: Really
force evaluation of the expression, if any, when the object has its
elaboration delayed. Do not create a variable at global level.
2015-05-26 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Machine>: Do not apply

View File

@ -5791,31 +5791,12 @@ gnat_to_gnu (Node_Id gnat_node)
gnu_expr
= emit_range_check (gnu_expr, Etype (gnat_temp), gnat_node);
/* If this object has its elaboration delayed, we must force
evaluation of GNU_EXPR right now and save it for when the object
is frozen. */
if (Present (Freeze_Node (gnat_temp)))
{
if (TREE_CONSTANT (gnu_expr))
;
else if (global_bindings_p ())
gnu_expr
= create_var_decl (create_concat_name (gnat_temp, "init"),
NULL_TREE, TREE_TYPE (gnu_expr), gnu_expr,
false, false, false, false,
NULL, gnat_temp);
else
gnu_expr = gnat_save_expr (gnu_expr);
save_gnu_tree (gnat_node, gnu_expr, true);
}
if (type_annotate_only && TREE_CODE (gnu_expr) == ERROR_MARK)
gnu_expr = NULL_TREE;
}
else
gnu_expr = NULL_TREE;
if (type_annotate_only && gnu_expr && TREE_CODE (gnu_expr) == ERROR_MARK)
gnu_expr = NULL_TREE;
/* If this is a deferred constant with an address clause, we ignore the
full view since the clause is on the partial view and we cannot have
2 different GCC trees for the object. The only bits of the full view
@ -5825,7 +5806,19 @@ gnat_to_gnu (Node_Id gnat_node)
&& Present (Full_View (gnat_temp)))
save_gnu_tree (Full_View (gnat_temp), error_mark_node, true);
if (No (Freeze_Node (gnat_temp)))
/* If this object has its elaboration delayed, we must force evaluation
of GNU_EXPR now and save it for the freeze point. Note that we need
not do anything special at the global level since the lifetime of the
temporary is fully contained within the elaboration routine. */
if (Present (Freeze_Node (gnat_temp)))
{
if (gnu_expr)
{
gnu_result = gnat_save_expr (gnu_expr);
save_gnu_tree (gnat_node, gnu_result, true);
}
}
else
gnat_to_gnu_entity (gnat_temp, gnu_expr, 1);
break;

View File

@ -1,3 +1,10 @@
2015-05-26 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/atomic7_1.adb: New test.
* gnat.dg/atomic7_2.adb: Likewise.
* gnat.dg/atomic7_pkg1.ads: New helper.
* gnat.dg/atomic7_pkg2.ad[sb]: Likewise.
2015-05-26 Michael Matz <matz@suse.de>
PR middle-end/66251

View File

@ -0,0 +1,16 @@
-- { dg-do run }
with Atomic7_Pkg2; use Atomic7_Pkg2;
procedure Atomic7_1 is
I : Integer := Stamp;
pragma Atomic (I);
J : Integer := Stamp;
begin
if I /= 1 then
raise Program_Error;
end if;
end;

View File

@ -0,0 +1,10 @@
--- { dg-do run }
with Atomic7_Pkg1; use Atomic7_Pkg1;
procedure Atomic7_2 is
begin
if I /= 1 then
raise Program_Error;
end if;
end;

View File

@ -0,0 +1,10 @@
with Atomic7_Pkg2; use Atomic7_Pkg2;
package Atomic7_Pkg1 is
I : Integer := Stamp;
pragma Atomic (I);
J : Integer := Stamp;
end Atomic7_Pkg1;

View File

@ -0,0 +1,14 @@
pragma Restrictions (No_Elaboration_Code);
package body Atomic7_Pkg2 is
T : Natural := 0;
pragma Atomic (T);
function Stamp return Natural is
begin
T := T + 1;
return T;
end;
end Atomic7_Pkg2;

View File

@ -0,0 +1,5 @@
package Atomic7_Pkg2 is
function Stamp return Natural;
end Atomic7_Pkg2;