Description
Consider the following code:
module m
type base
integer(4) :: i = -999
contains
procedure, pass(b) :: array_scalar
procedure, pass :: elemental
generic :: assignment(=) => array_scalar,elemental
end type
contains
subroutine array_scalar ( a, b )
class(base), intent(out) :: a(:)
class(base), intent(in) :: b
print *,'array_scalar'
do i =0, size(a)-1
a(i+1)%i = b%i + i
end do
end subroutine
impure elemental subroutine elemental ( a, b )
class(base), intent(out) :: a
class(base), intent(in) :: b
print*, "elemental"
a%i = b%i + 1
end subroutine
end module
program genericAssignmentPass011
use m
class(base), allocatable :: b1, b2(:)
allocate (b1, b2(3))
b1 = base(100)
print *, b1%i
b2 = b1 !! ERROR: should resolve to subroutine "array_scalar" rather than "elemental"
print *, b2%i
end program
The defined assignment b2 = b1
has a more specific subroutine (array_scalar
) to resolve to rather than the elemental subroutine elemental
.
All ifort, gfortran and XLF outputs the same expected result.
elemental
101
array_scalar
101 102 103
But Flang has
elemental
101
elemental
elemental
elemental
102 102 102