re PR fortran/52012 (Wrong-code with realloc on assignment and RESHAPE w/ ORDER=)
2012-01-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/52012 * trans-expr.c (fcncall_realloc_result): Correct calculation of result offset. 2012-01-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/52012 * gfortran.dg/realloc_on_assign_10.f90: New test. From-SVN: r183757
This commit is contained in:
parent
a2be33be24
commit
458842fb38
4 changed files with 41 additions and 16 deletions
|
@ -1,3 +1,9 @@
|
|||
2012-01-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/52012
|
||||
* trans-expr.c (fcncall_realloc_result): Correct calculation of
|
||||
result offset.
|
||||
|
||||
2012-01-29 Janne Blomqvist <jb@gcc.gnu.org>
|
||||
|
||||
* module.c (pointer_info): Make true_name and module pointers
|
||||
|
|
|
@ -6310,16 +6310,11 @@ fcncall_realloc_result (gfc_se *se, int rank)
|
|||
gfc_add_modify (&se->post, desc, res_desc);
|
||||
|
||||
offset = gfc_index_zero_node;
|
||||
tmp = gfc_index_one_node;
|
||||
/* Now reset the bounds from zero based to unity based. */
|
||||
|
||||
/* Now reset the bounds from zero based to unity based and set the
|
||||
offset accordingly. */
|
||||
for (n = 0 ; n < rank; n++)
|
||||
{
|
||||
/* Accumulate the offset. */
|
||||
offset = fold_build2_loc (input_location, MINUS_EXPR,
|
||||
gfc_array_index_type,
|
||||
offset, tmp);
|
||||
/* Now do the bounds. */
|
||||
gfc_conv_descriptor_offset_set (&se->post, desc, tmp);
|
||||
tmp = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
|
||||
tmp = fold_build2_loc (input_location, PLUS_EXPR,
|
||||
gfc_array_index_type,
|
||||
|
@ -6330,15 +6325,16 @@ fcncall_realloc_result (gfc_se *se, int rank)
|
|||
gfc_conv_descriptor_ubound_set (&se->post, desc,
|
||||
gfc_rank_cst[n], tmp);
|
||||
|
||||
/* The extent for the next contribution to offset. */
|
||||
tmp = fold_build2_loc (input_location, MINUS_EXPR,
|
||||
gfc_array_index_type,
|
||||
gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]),
|
||||
gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]));
|
||||
tmp = fold_build2_loc (input_location, PLUS_EXPR,
|
||||
gfc_array_index_type,
|
||||
tmp, gfc_index_one_node);
|
||||
/* Accumulate the offset. Since all lbounds are unity, offset
|
||||
is just minus the sum of the strides. */
|
||||
tmp = gfc_conv_descriptor_stride_get (desc, gfc_rank_cst[n]);
|
||||
offset = fold_build2_loc (input_location, MINUS_EXPR,
|
||||
gfc_array_index_type,
|
||||
offset, tmp);
|
||||
offset = gfc_evaluate_now (offset, &se->post);
|
||||
|
||||
}
|
||||
|
||||
gfc_conv_descriptor_offset_set (&se->post, desc, offset);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-01-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/52012
|
||||
* gfortran.dg/realloc_on_assign_10.f90: New test.
|
||||
|
||||
2012-01-31 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/51528
|
||||
|
|
18
gcc/testsuite/gfortran.dg/realloc_on_assign_10.f90
Normal file
18
gcc/testsuite/gfortran.dg/realloc_on_assign_10.f90
Normal file
|
@ -0,0 +1,18 @@
|
|||
! { dg-do run }
|
||||
! PR52012 - with realloc_lhs active(ie. default condition) the
|
||||
! offset was wrongly calculated for a, after assignment.
|
||||
!
|
||||
! Reported by Reinhold Bader and Tobias Burnus <burnus@gcc.gnu.org>
|
||||
!
|
||||
program gf
|
||||
implicit none
|
||||
real, allocatable :: a(:,:,:)
|
||||
real, parameter :: zero = 0.0, one = 1.0
|
||||
real :: b(3,4,5) = zero
|
||||
b(1,2,3) = one
|
||||
allocate (a(size (b, 3), size (b, 2), size (b, 1)))
|
||||
a = reshape (b, shape (a), order = [3, 2, 1])
|
||||
if (any (a(:, 2, 1) .ne. [zero, zero, one, zero, zero])) call abort
|
||||
if (a(3, 2, 1) /= one) call abort()
|
||||
if (sum (abs (a)) /= one) call abort()
|
||||
end program
|
Loading…
Add table
Reference in a new issue