Commit e8db6cd5 by Paul Thomas

re PR fortran/87336 (wrong output for pointer dummy assiocated to target actual argument)

2018-09-18  Paul Thomas  <pault@gcc.gnu.org>

	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  <pault@gcc.gnu.org>

	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
parent b819cc44
2018-09-18 Paul Thomas <pault@gcc.gnu.org>
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 <pault@gcc.gnu.org>
PR fortran/64120
......
......@@ -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
......
2018-09-18 Paul Thomas <pault@gcc.gnu.org>
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 <paolo.carlini@oracle.com>
PR c++/85065
......
......@@ -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" } }
! { 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 <juergen.reuter@desy.de> 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
......@@ -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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment