From: Paul Thomas Date: Tue, 18 Sep 2018 17:58:20 +0000 (+0000) Subject: re PR fortran/87336 (wrong output for pointer dummy assiocated to target actual argument) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e8db6cd5fb1ad254329e426dcc8e958c02e2284f;p=gcc.git re PR fortran/87336 (wrong output for pointer dummy assiocated to target actual argument) 2018-09-18 Paul Thomas PR fortran/87336 * trans-array.c (gfc_get_array_span): Try to get the element length of incomplete types. Return NULL_TREE otherwise. (gfc_conv_expr_descriptor): Only set the 'span' field if the above does not return NULL_TREE. Set 'span' field if possible for all new descriptors. 2018-09-18 Paul Thomas PR fortran/87336 * gfortran.dg/pointer_array_10.f90 : New test. * gfortran.dg/assign_10.f90 : Increase 'parm' count to 20. * gfortran.dg/transpose_optimization_2.f90 : Increase 'parm' count to 72. From-SVN: r264405 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3980146aef7..5f10add3f0b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2018-09-18 Paul Thomas + + PR fortran/87336 + * trans-array.c (gfc_get_array_span): Try to get the element + length of incomplete types. Return NULL_TREE otherwise. + (gfc_conv_expr_descriptor): Only set the 'span' field if the + above does not return NULL_TREE. Set 'span' field if possible + for all new descriptors. + 2018-09-17 Paul Thomas PR fortran/64120 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 9565b7d8dd9..95ea61550cf 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -849,10 +849,22 @@ gfc_get_array_span (tree desc, gfc_expr *expr) else { /* If none of the fancy stuff works, the span is the element - size of the array. */ + size of the array. Attempt to deal with unbounded character + types if possible. Otherwise, return NULL_TREE. */ tmp = gfc_get_element_type (TREE_TYPE (desc)); - tmp = fold_convert (gfc_array_index_type, - size_in_bytes (tmp)); + if (tmp && TREE_CODE (tmp) == ARRAY_TYPE + && TYPE_MAX_VALUE (TYPE_DOMAIN (tmp)) == NULL_TREE) + { + if (expr->expr_type == EXPR_VARIABLE + && expr->ts.type == BT_CHARACTER) + tmp = fold_convert (gfc_array_index_type, + gfc_get_expr_charlen (expr)); + else + tmp = NULL_TREE; + } + else + tmp = fold_convert (gfc_array_index_type, + size_in_bytes (tmp)); } return tmp; } @@ -7074,7 +7086,8 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) /* ....and set the span field. */ tmp = gfc_get_array_span (desc, expr); - gfc_conv_descriptor_span_set (&se->pre, se->expr, tmp); + if (tmp != NULL_TREE) + gfc_conv_descriptor_span_set (&se->pre, se->expr, tmp); } else if (se->want_pointer) { @@ -7344,13 +7357,9 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) desc = info->descriptor; if (se->direct_byref && !se->byref_noassign) { - /* For pointer assignments we fill in the destination.... */ + /* For pointer assignments we fill in the destination. */ parm = se->expr; parmtype = TREE_TYPE (parm); - - /* ....and set the span field. */ - tmp = gfc_get_array_span (desc, expr); - gfc_conv_descriptor_span_set (&loop.pre, parm, tmp); } else { @@ -7388,6 +7397,11 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) } } + /* Set the span field. */ + tmp = gfc_get_array_span (desc, expr); + if (tmp != NULL_TREE) + gfc_conv_descriptor_span_set (&loop.pre, parm, tmp); + offset = gfc_index_zero_node; /* The following can be somewhat confusing. We have two diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7a7a7c24563..29481f07fc7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-09-18 Paul Thomas + + PR fortran/87336 + * gfortran.dg/pointer_array_10.f90 : New test. + * gfortran.dg/assign_10.f90 : Increase 'parm' count to 20. + * gfortran.dg/transpose_optimization_2.f90 : Increase 'parm' + count to 72. + 2018-09-18 Paolo Carlini PR c++/85065 diff --git a/gcc/testsuite/gfortran.dg/assign_10.f90 b/gcc/testsuite/gfortran.dg/assign_10.f90 index 42f66e5b533..6e57bef1650 100644 --- a/gcc/testsuite/gfortran.dg/assign_10.f90 +++ b/gcc/testsuite/gfortran.dg/assign_10.f90 @@ -23,5 +23,5 @@ end ! cases will all yield a temporary, so that atmp appears 18 times. ! Note that it is the kind conversion that generates the temp. ! -! { dg-final { scan-tree-dump-times "parm" 18 "original" } } +! { dg-final { scan-tree-dump-times "parm" 20 "original" } } ! { dg-final { scan-tree-dump-times "atmp" 18 "original" } } diff --git a/gcc/testsuite/gfortran.dg/pointer_array_10.f90 b/gcc/testsuite/gfortran.dg/pointer_array_10.f90 new file mode 100644 index 00000000000..4e7b1402f62 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pointer_array_10.f90 @@ -0,0 +1,27 @@ +! { dg-do run } +! +! Test the fix for PR87336, in which the 'span' field of the array +! descriptor, passed to 'show', was not set. +! +! Contributed by Juergen Reuter following +! a posting to clf by 'Spectrum'. +! +program main + implicit none + integer, target :: a( 2:4 ) + + a = [2,3,4] +! print *, "a [before] = ", a + call show( a ) +! print *, "a [after] = ", a + if (any (a .ne. [200,300,400])) stop 1 + +contains + subroutine show( arr ) + integer, pointer, intent(in) :: arr(:) +! print *, "arr = ", arr +! print *, "bounds = ", lbound(arr), ubound(arr) + arr(:) = [200,300,400] +! print *, "arr2= ", arr + end subroutine show + end program diff --git a/gcc/testsuite/gfortran.dg/transpose_optimization_2.f90 b/gcc/testsuite/gfortran.dg/transpose_optimization_2.f90 index 84b5a9e560e..4748da19547 100644 --- a/gcc/testsuite/gfortran.dg/transpose_optimization_2.f90 +++ b/gcc/testsuite/gfortran.dg/transpose_optimization_2.f90 @@ -60,5 +60,5 @@ end ! ! The check below for temporaries gave 14 and 33 for "parm" and "atmp". ! -! { dg-final { scan-tree-dump-times "parm" 66 "original" } } +! { dg-final { scan-tree-dump-times "parm" 72 "original" } } ! { dg-final { scan-tree-dump-times "atmp" 12 "original" } }