Skip to content

[flang] Defined assignment resolution error #142481

@DanielCChen

Description

@DanielCChen

Consider the following code:

module m

   type base
      integer :: i
      contains
         procedure :: bassgn
         generic :: assignment(=) => bassgn
   end type

   type, extends(base) :: child
      integer :: j
      contains
         procedure :: cassgn
         generic :: assignment(=) => cassgn
   end type

   type container
      class(base), allocatable :: b1
      class(child), allocatable :: c1
   end type

   contains

      impure elemental subroutine bassgn ( a, b )
         class(base), intent(out) :: a
         type(base), intent(in)   :: b

         a%i = b%i + 1

         select type ( a )
            type is ( child )
               a%j = b%i + 2
         end select

      end subroutine

      impure elemental subroutine cassgn ( a, b )
         class(child), intent(out) :: a
         type(child), intent(in)   :: b

         a%i = b%i + 2
         a%j = b%j + 2

      end subroutine

end module

program genericAssignmentDtIntrinAssgn029
   use m

   type(container) :: c1, c2, c3
   pointer :: c2
   allocatable :: c3

   allocate ( c2, c3 )

   allocate ( c2%b1, source = child(1,2) )
   allocate ( c2%c1, source = child(9,10))

   c1 = c2
   c3 = c1

   select type ( g => c1%b1 )
      type is ( child )
         select type ( h => c1%c1 )
            type is ( child )
               print *, g%j                    !! ERROR
         end select
   end select

   select type ( g => c3%b1 )
      type is ( child )
         select type ( h => c3%c1 )
            type is ( child )
               print *, g%j                    !! ERROR
         end select
   end select

end program

Expected output:

3
4

Flang outputs:

0
0

Both assignment c1 = c2 and c3 = c1 should resolve to cassgn for the b1 component as its dynamic type is child.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions