Commit 94f3d11c by Paul Thomas

re PR fortran/91077 (Wrong indexing when using a pointer)

2019-07-07  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/91077
	* trans-array.c (gfc_conv_scalarized_array_ref) Delete code
	that gave symbol backend decl for subref arrays and deferred
	length variables.

2019-07-07  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/91077
	* gfortran.dg/pointer_array_11.f90 : New test.

From-SVN: r273176
parent 0b3839a4
2019-07-07 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91077
* trans-array.c (gfc_conv_scalarized_array_ref) Delete code
that gave symbol backend decl for subref arrays and deferred
length variables.
2019-07-05 Andrew Stubbs <ams@codesourcery.com>
* openmp.c (resolve_omp_clauses): Add custom error messages for
......@@ -33,9 +40,9 @@
ChangeLog forgotten with revision 272667
* decl.c (access_attr_decl): Use temporary variable to reduce
unreadability of code. Normalize jumping to return.
(gfc_match_protected): Fix parsing error. Add comments to
(gfc_match_protected): Fix parsing error. Add comments to
explain code. Remove dead code.
(gfc_match_private): Use temporary variable to reduce unreadability
(gfc_match_private): Use temporary variable to reduce unreadability
of code. Fix parsing error. Move code to test for blank PRIVATE.
Remove dead code.
(gfc_match_public): Move code to test for blank PUBLIC. Fix
......
......@@ -3502,19 +3502,7 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar)
return;
if (get_CFI_desc (NULL, expr, &decl, ar))
{
decl = build_fold_indirect_ref_loc (input_location, decl);
goto done;
}
if (expr && ((is_subref_array (expr)
&& GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (info->descriptor)))
|| (expr->ts.deferred && (expr->expr_type == EXPR_VARIABLE
|| expr->expr_type == EXPR_FUNCTION))))
decl = expr->symtree->n.sym->backend_decl;
if (decl && GFC_DECL_PTR_ARRAY_P (decl))
goto done;
decl = build_fold_indirect_ref_loc (input_location, decl);
/* A pointer array component can be detected from its field decl. Fix
the descriptor, mark the resulting variable decl and pass it to
......@@ -3532,7 +3520,6 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar)
decl = info->descriptor;
}
done:
se->expr = gfc_build_array_ref (base, index, decl);
}
......@@ -7865,7 +7852,7 @@ array_parameter_size (tree desc, gfc_expr *expr, tree *size)
}
/* Helper function - return true if the argument is a pointer. */
static bool
is_pointer (gfc_expr *e)
{
......
2019-07-07 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91077
* gfortran.dg/pointer_array_11.f90 : New test.
2019-07-06 Jakub Jelinek <jakub@redhat.com>
* c-c++-common/gomp/scan-4.c: Don't expect sorry message.
......
! { dg-do run }
!
! Test the fix for PR91077 - both the original test and that in comment #4 of the PR.
!
! Contribute by Ygal Klein <ygalklein@gmail.com>
!
program test
implicit none
call original
call comment_4
contains
subroutine original
integer, parameter :: length = 9
real(8), dimension(2) :: a, b
integer :: i
type point
real(8) :: x
end type point
type stored
type(point), dimension(:), allocatable :: np
end type stored
type(stored), dimension(:), pointer :: std =>null()
allocate(std(1))
allocate(std(1)%np(length))
std(1)%np(1)%x = 0.3d0
std(1)%np(2)%x = 0.3555d0
std(1)%np(3)%x = 0.26782d0
std(1)%np(4)%x = 0d0
std(1)%np(5)%x = 1.555d0
std(1)%np(6)%x = 7.3d0
std(1)%np(7)%x = 7.8d0
std(1)%np(8)%x = 6.3d0
std(1)%np(9)%x = 5.5d0
! do i = 1, 2
! write(*, "('std(1)%np(',i1,')%x = ',1e22.14)") i, std(1)%np(i)%x
! end do
! do i = 1, 2
! write(*, "('std(1)%np(1:',i1,') = ',9e22.14)") i, std(1)%np(1:i)%x
! end do
a = std(1)%np(1:2)%x
b = [std(1)%np(1)%x, std(1)%np(2)%x]
! print *,a
! print *,b
if (allocated (std(1)%np)) deallocate (std(1)%np)
if (associated (std)) deallocate (std)
if (norm2(a - b) .gt. 1d-3) stop 1
end subroutine
subroutine comment_4
integer, parameter :: length = 2
real(8), dimension(length) :: a, b
integer :: i
type point
real(8) :: x
end type point
type points
type(point), dimension(:), pointer :: np=>null()
end type points
type stored
integer :: l
type(points), pointer :: nfpoint=>null()
end type stored
type(stored), dimension(:), pointer :: std=>null()
allocate(std(1))
allocate(std(1)%nfpoint)
allocate(std(1)%nfpoint%np(length))
std(1)%nfpoint%np(1)%x = 0.3d0
std(1)%nfpoint%np(2)%x = 0.3555d0
! do i = 1, length
! write(*, "('std(1)%nfpoint%np(',i1,')%x = ',1e22.14)") i, std(1)%nfpoint%np(i)%x
! end do
! do i = 1, length
! write(*, "('std(1)%nfpoint%np(1:',i1,')%x = ',2e22.14)") i, std(1)%nfpoint%np(1:i)%x
! end do
a = std(1)%nfpoint%np(1:2)%x
b = [std(1)%nfpoint%np(1)%x, std(1)%nfpoint%np(2)%x]
if (associated (std(1)%nfpoint%np)) deallocate (std(1)%nfpoint%np)
if (associated (std(1)%nfpoint)) deallocate (std(1)%nfpoint)
if (associated (std)) deallocate (std)
if (norm2(a - b) .gt. 1d-3) stop 2
end subroutine
end program test
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