This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/88447] New: Non-contiguous array argument of some class not passed properly to subroutine
- From: "mscfd at gmx dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 11 Dec 2018 09:17:30 +0000
- Subject: [Bug fortran/88447] New: Non-contiguous array argument of some class not passed properly to subroutine
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88447
Bug ID: 88447
Summary: Non-contiguous array argument of some class not passed
properly to subroutine
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: mscfd at gmx dot net
Target Milestone: ---
Using a non-contiguous argument to a subroutine whose declaration is "class(s),
dimension(:)" gives wrong results. The output looks like that some internal
offset in the array descriptor is computed wrongly. Using type(s) instead of
class(s) fixes the problem. The bug also occurs with the class(*) variant.
module mod
implicit none
private
public p, qi, qr, qv
type, public :: s
real, dimension(1:3) :: vec
end type s
type, public :: t
integer :: i
type(s) :: v
real :: r
end type t
contains
subroutine p(x)
class(*), dimension(:), intent(in) :: x
integer :: i
select type (x)
type is (integer)
write(*,'(a,*(i12))') 'x = ', x
type is (real)
write(*,'(a,*(f12.3))') 'x = ', x
type is (s)
write(*,'(a,*(3f12.3," |"))') 'x = ', (x(i)%vec, i=1,ubound(x,1))
end select
end subroutine p
subroutine qi(x)
integer, dimension(:), intent(in) :: x
write(*,'(a,*(i12))') 'x = ', x
end subroutine qi
subroutine qr(x)
real, dimension(:), intent(in) :: x
write(*,'(a,*(f12.3))') 'x = ', x
end subroutine qr
subroutine qv(x)
! with type(s) the bug does not occur
!type(s), dimension(:), intent(in) :: x
class(s), dimension(:), intent(in) :: x
integer :: i
write(*,'(a,*(3f12.3," |"))') 'x = ', (x(i)%vec, i=1,ubound(x,1))
end subroutine qv
end module mod
program noncontiguous
use mod
implicit none
integer :: k
type(t), dimension(1:4) :: a
do k = 1,4
a(k)%i = k
a(k)%r = 10.0 * 2.0*real(k)
a(k)%v%vec = [real(k)-2.0, real(k)-3.0, real(k)-5.0]
end do
! wrong output for all three calls
call p(a%i)
call p(a%r)
call p(a%v)
! correct output for the first and second call,
! wrong output for third call (correct if type(s) instead of class(s) is used)
call qi(a%i)
call qr(a%r)
call qv(a%v)
end program noncontiguous