aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/trans.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r--gcc/ada/gcc-interface/trans.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 3c957a6..cb8662c 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -3309,12 +3309,12 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data)
if (TREE_CODE (ret_val) == COMPOUND_EXPR
&& TREE_CODE (TREE_OPERAND (ret_val, 0)) == INIT_EXPR)
{
+ tree rhs = TREE_OPERAND (TREE_OPERAND (ret_val, 0), 1);
+
if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (ret_val)))
- ret_val
- = (*CONSTRUCTOR_ELTS (TREE_OPERAND (TREE_OPERAND (ret_val, 0),
- 1)))[1].value;
+ ret_val = CONSTRUCTOR_ELT (rhs, 1)->value;
else
- ret_val = TREE_OPERAND (TREE_OPERAND (ret_val, 0), 1);
+ ret_val = rhs;
}
/* Strip useless conversions around the return value. */
@@ -3365,20 +3365,21 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data)
if (TYPE_IS_FAT_POINTER_P (TREE_TYPE (alloc)))
{
+ tree cst = TREE_OPERAND (alloc, 1);
+
/* The new initial value is a COMPOUND_EXPR with the allocation in
the first arm and the value of P_ARRAY in the second arm. */
DECL_INITIAL (new_var)
= build2 (COMPOUND_EXPR, TREE_TYPE (new_var),
TREE_OPERAND (alloc, 0),
- (*CONSTRUCTOR_ELTS (TREE_OPERAND (alloc, 1)))[0].value);
+ CONSTRUCTOR_ELT (cst, 0)->value);
/* Build a modified CONSTRUCTOR that references NEW_VAR. */
p_array = TYPE_FIELDS (TREE_TYPE (alloc));
CONSTRUCTOR_APPEND_ELT (v, p_array,
fold_convert (TREE_TYPE (p_array), new_var));
CONSTRUCTOR_APPEND_ELT (v, DECL_CHAIN (p_array),
- (*CONSTRUCTOR_ELTS (
- TREE_OPERAND (alloc, 1)))[1].value);
+ CONSTRUCTOR_ELT (cst, 1)->value);
new_ret = build_constructor (TREE_TYPE (alloc), v);
}
else