aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2015-05-26 20:37:29 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2015-05-26 20:37:29 +0000
commit545b492365b7ce6270d739c3ad88b05c51d4aeab (patch)
treef9df444e7d4df8c80c2430f4be31be937167651d /gcc/ada
parentc68cdfac5b85560441d585d4151f65812180821b (diff)
downloadgcc-545b492365b7ce6270d739c3ad88b05c51d4aeab.zip
gcc-545b492365b7ce6270d739c3ad88b05c51d4aeab.tar.gz
gcc-545b492365b7ce6270d739c3ad88b05c51d4aeab.tar.bz2
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
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c37
2 files changed, 21 insertions, 22 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index d6d7af5..dcb4620 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,11 @@
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
extra-precision trick to literals. Build SAVE_EXPR manually.
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index b1c1551..8efa59d 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -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;