http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55850



             Bug #: 55850

           Summary: [OOP] SELECT TYPE issues

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Keywords: accepts-invalid, ice-on-invalid-code

          Severity: normal

          Priority: P3

         Component: fortran

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: bur...@gcc.gnu.org

                CC: pa...@gcc.gnu.org





a) Accepts invalid with coindexed variables. Fortran 2008:



R804  association  is  associate-name => selector

R805  selector  is  expr

                or  variable

C801 (R804) If selector is not a variable or is a variable that has a vector

subscript, associate-name shall not appear in a variable definition context

(16.6.7).

C802 (R804) An associate-name shall not be the same as another associate-name

in the same associate-stmt.

C803 (R805) variable shall not be a coindexed object.

C804 (R805) expr shall not be a variable.





I think that prohibits:

  associate (myname => coarray[i])



For ASSOCIATE, one gets:



associate (x => caf[4])

                      1

Error: Association target at (1) must not be coindexed





But for SELECT TYPE, it is accepted:



module gn

  type :: ncb

  end type ncb

  type, public :: tn

     class(ncb), allocatable :: cb(:)[:]

  end type tn

contains

  integer function name(self)

    implicit none

    class (tn), intent(in) :: self

    select type (component => self%cb(1)[4])  ! INVALID due to the "[4]"

    end select

  end function name

end module gn





Note: The problem is not the coarray, just the coindex (gfc_is_coindexed).







b) ICE with the following:

    select type (t = self%cb)

Note the "=" opposed to "=>". Backtrace:



0x5e32d0 gfc_undo_symbols()

        ../../gcc/fortran/symbol.c:2972

0x5af3aa reject_statement

        ../../gcc/fortran/parse.c:1747

0x5af4dc match_word

        ../../gcc/fortran/parse.c:72





module gn

  type :: ncb

  end type ncb

  type, public :: tn

     class(ncb), allocatable :: cb

  end type tn

contains

  integer function name(self)

    implicit none

    class (tn), intent(in) :: self

    select type (t = self%cb)

    end select

  end function name

end module gn







c) The following also ICEs:



0x5cd395 resolve_select_type

        ../../gcc/fortran/resolve.c:7791

0x5cd395 resolve_code

        ../../gcc/fortran/resolve.c:9707





module gn

  type :: ncb

  end type ncb

  type, public :: tn

     type(ncb), allocatable :: cb

  end type tn

contains

  integer function name(self)

    implicit none

    class (tn), intent(in) :: self

    select type (t => self%cb)

    type is (ncb)

        t = 5

    end select

  end function name

end module gn

Reply via email to