https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81093

            Bug ID: 81093
           Summary: Accessing ranges of values in derived types leads to
                    wrong result
           Product: gcc
           Version: 6.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: thomas.jourdan at orange dot fr
  Target Milestone: ---

Hello,

The following code leads to a correct or a wrong result, depending on whether
the select type construct is used or not. If it is not used, I get:
           1          -1           1          -1
           2          -2           2          -2
whereas if it is used, the result is
           1           1           1           1
           2           2           2           2
I am not quite sure that the program is standard conforming and that it is a
bug, since there is perhaps no reason for Gfortran to know how to retrieve data
if the complete data structure (data_type2) is not known.

Regards,

Thomas

-----------

program test

  implicit none

  type data_type1
    integer, dimension(2) :: data1
  end type data_type1

  type, extends(data_type1) :: data_type2
    integer, dimension(2) :: data2
  end type data_type2

  type data_gen
    class(data_type1), dimension(:), allocatable :: mydata
  end type data_gen

  type(data_gen) :: gen_data

  integer :: ii
  integer, parameter :: nn = 4


  allocate(data_type2::gen_data%mydata(nn))

  select type(data => gen_data%mydata)
  type is (data_type2)
    do ii = 1, nn
      data(ii)%data1(1:2) = (/1,2/)
      data(ii)%data2(1:2) = (/-1,-2/)
    end do
  end select

  ! wrong result
  write(*,*) gen_data%mydata(1:nn)%data1(1)
  write(*,*) gen_data%mydata(1:nn)%data1(2)

  ! correct result
  select type(data => gen_data%mydata)
  type is (data_type2)
    write(*,*) data(1:nn)%data1(1)
    write(*,*) data(1:nn)%data1(2)
  end select

end program test

Reply via email to