! { dg-do run }
|
! { dg-do run }
|
! { dg-options "-fbounds-check" }
|
! { dg-options "-fbounds-check" }
|
! Tests the fix for PR30003, in which the 'end' of an array section
|
! Tests the fix for PR30003, in which the 'end' of an array section
|
! would not be evaluated at all if it was on the lhs of an assignment
|
! would not be evaluated at all if it was on the lhs of an assignment
|
! or would be evaluated many times if bound checking were on.
|
! or would be evaluated many times if bound checking were on.
|
!
|
!
|
! Contributed by Erik Edelmann
|
! Contributed by Erik Edelmann
|
!
|
!
|
implicit none
|
implicit none
|
integer :: a(5), b(3), cnt
|
integer :: a(5), b(3), cnt
|
|
|
b = [ 1, 2, 3 ]
|
b = [ 1, 2, 3 ]
|
! Check the lhs references
|
! Check the lhs references
|
cnt = 0
|
cnt = 0
|
a(bar(1):3) = b
|
a(bar(1):3) = b
|
if (cnt /= 1) call abort ()
|
if (cnt /= 1) call abort ()
|
cnt = 0
|
cnt = 0
|
a(1:bar(3)) = b
|
a(1:bar(3)) = b
|
if (cnt /= 1) call abort ()
|
if (cnt /= 1) call abort ()
|
cnt = 0
|
cnt = 0
|
a(1:3:bar(1)) = b
|
a(1:3:bar(1)) = b
|
if (cnt /= 1) call abort ()
|
if (cnt /= 1) call abort ()
|
! Check the rhs references
|
! Check the rhs references
|
cnt = 0
|
cnt = 0
|
a(1:3) = b(bar(1):3)
|
a(1:3) = b(bar(1):3)
|
if (cnt /= 1) call abort ()
|
if (cnt /= 1) call abort ()
|
cnt = 0
|
cnt = 0
|
a(1:3) = b(1:bar(3))
|
a(1:3) = b(1:bar(3))
|
if (cnt /= 1) call abort ()
|
if (cnt /= 1) call abort ()
|
cnt = 0
|
cnt = 0
|
a(1:3) = b(1:3:bar(1))
|
a(1:3) = b(1:3:bar(1))
|
if (cnt /= 1) call abort ()
|
if (cnt /= 1) call abort ()
|
contains
|
contains
|
integer function bar(n)
|
integer function bar(n)
|
integer, intent(in) :: n
|
integer, intent(in) :: n
|
cnt = cnt + 1
|
cnt = cnt + 1
|
bar = n
|
bar = n
|
end function bar
|
end function bar
|
end
|
end
|
|
|