Dear All,

This turned out to be a valid uninitialized variable warning.
However, it was unlikely ever to cause problems at run-time.
Nonetheless, here is the fix. I am disinclined to load the testsuite
with a  fix that is so specific and localized that it simply will not
break.  However, if reviewers think otherwise, I can easily add the
original testcase.

Bootstrapped and regtested on FC17/x86_64 - OK from trunk and 4.8?

Cheers

Paul

2013-11-30  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/58410
    * trans-array.c (gfc_alloc_allocatable_for_assignment): Do not
    use the array bounds of an unallocated array but set its size
    to zero instead.
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c   (revision 205031)
--- gcc/fortran/trans-array.c   (working copy)
*************** gfc_alloc_allocatable_for_assignment (gf
*** 8068,8073 ****
--- 8076,8082 ----
    tree size1;
    tree size2;
    tree array1;
+   tree cond_null;
    tree cond;
    tree tmp;
    tree tmp2;
*************** gfc_alloc_allocatable_for_assignment (gf
*** 8143,8151 ****
    jump_label2 = gfc_build_label_decl (NULL_TREE);

    /* Allocate if data is NULL.  */
!   cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
                         array1, build_int_cst (TREE_TYPE (array1), 0));
!   tmp = build3_v (COND_EXPR, cond,
                  build1_v (GOTO_EXPR, jump_label1),
                  build_empty_stmt (input_location));
    gfc_add_expr_to_block (&fblock, tmp);
--- 8152,8160 ----
    jump_label2 = gfc_build_label_decl (NULL_TREE);

    /* Allocate if data is NULL.  */
!   cond_null = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
                               array1, build_int_cst (TREE_TYPE (array1), 0));
!   tmp = build3_v (COND_EXPR, cond_null,
                  build1_v (GOTO_EXPR, jump_label1),
                  build_empty_stmt (input_location));
    gfc_add_expr_to_block (&fblock, tmp);
*************** gfc_alloc_allocatable_for_assignment (gf
*** 8197,8209 ****
    tmp = build1_v (LABEL_EXPR, jump_label1);
    gfc_add_expr_to_block (&fblock, tmp);

!   size1 = gfc_conv_descriptor_size (desc, expr1->rank);

!   /* Get the rhs size.  Fix both sizes.  */
    if (expr2)
      desc2 = rss->info->data.array.descriptor;
    else
      desc2 = NULL_TREE;
    size2 = gfc_index_one_node;
    for (n = 0; n < expr2->rank; n++)
      {
--- 8206,8230 ----
    tmp = build1_v (LABEL_EXPR, jump_label1);
    gfc_add_expr_to_block (&fblock, tmp);

!   /* If the lhs has not been allocated, its bounds will not have been
!      initialized and so its size is set to zero.  */
!   size1 = gfc_create_var (gfc_array_index_type, NULL);
!   gfc_init_block (&alloc_block);
!   gfc_add_modify (&alloc_block, size1, gfc_index_zero_node);
!   gfc_init_block (&realloc_block);
!   gfc_add_modify (&realloc_block, size1,
!                 gfc_conv_descriptor_size (desc, expr1->rank));
!   tmp = build3_v (COND_EXPR, cond_null,
!                 gfc_finish_block (&alloc_block),
!                 gfc_finish_block (&realloc_block));
!   gfc_add_expr_to_block (&fblock, tmp);

!   /* Get the rhs size and fix it.  */
    if (expr2)
      desc2 = rss->info->data.array.descriptor;
    else
      desc2 = NULL_TREE;
+
    size2 = gfc_index_one_node;
    for (n = 0; n < expr2->rank; n++)
      {
*************** gfc_alloc_allocatable_for_assignment (gf
*** 8217,8224 ****
                               gfc_array_index_type,
                               tmp, size2);
      }
-
-   size1 = gfc_evaluate_now (size1, &fblock);
    size2 = gfc_evaluate_now (size2, &fblock);

    cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
--- 8238,8243 ----

Reply via email to