aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-expr.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2020-08-10 06:22:22 +0100
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 15:07:52 -0300
commitfc267be27fe4eb8072ead7f7635f70a152999a14 (patch)
treeff9d4af83f8856ba1e0aef724aa71b6bc3d265c3 /gcc/fortran/trans-expr.c
parente6d42dd6cbf14f5859c0fb8b33a8a61d5906dafe (diff)
downloadgcc-fc267be27fe4eb8072ead7f7635f70a152999a14.zip
gcc-fc267be27fe4eb8072ead7f7635f70a152999a14.tar.gz
gcc-fc267be27fe4eb8072ead7f7635f70a152999a14.tar.bz2
This patch fixes PR96312. Cures a used uninitialized warning.
2020-08-10 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/96312 * trans-expr.c (fcncall_realloc_result): Only compare shapes if lhs was allocated.. gcc/testsuite/ PR fortran/96312 * gfortran.dg/pr96312.f90: New test.
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r--gcc/fortran/trans-expr.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index b7c568e..36ff9b5 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -9936,6 +9936,8 @@ fcncall_realloc_result (gfc_se *se, int rank)
tree tmp;
tree offset;
tree zero_cond;
+ tree not_same_shape;
+ stmtblock_t shape_block;
int n;
/* Use the allocation done by the library. Substitute the lhs
@@ -9965,7 +9967,11 @@ fcncall_realloc_result (gfc_se *se, int rank)
tmp = gfc_conv_descriptor_data_get (res_desc);
gfc_conv_descriptor_data_set (&se->post, desc, tmp);
- /* Check that the shapes are the same between lhs and expression. */
+ /* Check that the shapes are the same between lhs and expression.
+ The evaluation of the shape is done in 'shape_block' to avoid
+ unitialized warnings from the lhs bounds. */
+ not_same_shape = boolean_false_node;
+ gfc_start_block (&shape_block);
for (n = 0 ; n < rank; n++)
{
tree tmp1;
@@ -9982,15 +9988,24 @@ fcncall_realloc_result (gfc_se *se, int rank)
tmp = fold_build2_loc (input_location, NE_EXPR,
logical_type_node, tmp,
gfc_index_zero_node);
- tmp = gfc_evaluate_now (tmp, &se->post);
- zero_cond = fold_build2_loc (input_location, TRUTH_OR_EXPR,
- logical_type_node, tmp,
- zero_cond);
+ tmp = gfc_evaluate_now (tmp, &shape_block);
+ if (n == 0)
+ not_same_shape = tmp;
+ else
+ not_same_shape = fold_build2_loc (input_location, TRUTH_OR_EXPR,
+ logical_type_node, tmp,
+ not_same_shape);
}
/* 'zero_cond' being true is equal to lhs not being allocated or the
shapes being different. */
- zero_cond = gfc_evaluate_now (zero_cond, &se->post);
+ tmp = fold_build2_loc (input_location, TRUTH_OR_EXPR, logical_type_node,
+ zero_cond, not_same_shape);
+ gfc_add_modify (&shape_block, zero_cond, tmp);
+ tmp = gfc_finish_block (&shape_block);
+ tmp = build3_v (COND_EXPR, zero_cond,
+ build_empty_stmt (input_location), tmp);
+ gfc_add_expr_to_block (&se->post, tmp);
/* Now reset the bounds returned from the function call to bounds based
on the lhs lbounds, except where the lhs is not allocated or the shapes