diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2015-05-26 20:37:29 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2015-05-26 20:37:29 +0000 |
commit | 545b492365b7ce6270d739c3ad88b05c51d4aeab (patch) | |
tree | f9df444e7d4df8c80c2430f4be31be937167651d /gcc/ada | |
parent | c68cdfac5b85560441d585d4151f65812180821b (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 37 |
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; |