<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/141835>141835</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [flang] Incorrect implementation sequence when the defined assignment is elemental for allocatable component.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            flang:frontend
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          DanielCChen
      </td>
    </tr>
</table>

<pre>
    Consider the following code:
```
module m

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

   type, extends(base) :: child
      integer :: j
 end type

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

   contains

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

 print*, "in bassgn"
         a%i = b%i + 1
         select type ( a )
            type is ( child )
               print*, "a is child"
 select type ( b )
                  type is ( child )
 print*, "b is child"
                     a%j = b%j + 1
 end select
         end select

      end subroutine


end module

program genericAssignmentDtIntrinAssgn027
   use m

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

 allocate ( c2, c3 )

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

   c3 = c2

end program
```

Expected output:
```
> a.out
 in bassgn
 a is child
 b is child
```

Flang produces:
```
in bassgn
```

The standard says the following about the intrinsic assignment of `c3 = c2` [24-007: 10.2.1.3, paragraph 15, page 178]:
```
For a noncoarray allocatable component the following sequence of operations is applied.
(1) If the component of the variable is allocated, it is deallocated.
(2) If the component of the value of expr is allocated, the corresponding component of the variable is allocated with the same dynamic type and type parameters as the component of the value of expr. If it is an array, it is allocated with the same bounds. The value of the component of the value of expr is then assigned to the corresponding component of the variable using defined assignment if the declared type of the component has a type-bound defined assignment consistent with the component, and intrinsic assignment for the dynamic type of that component otherwise.
```
So `c3%b1` should be allocated with the dynamic type of `child` first before calling the defined assignment `bassgn`. Then both `select type` constructs inside the subroutine should be executed.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVt1yo7AOfhpyoykDTkjDRS7YZjOz12dfwNgiuOPYHNts27c_I5sE8tOdPZlOEyxL-r5PsjD3Xp0M4j6rfmTVYcXH0Fu3P3CjUL-99WhWrZVf-zdrvJLoIPQIndXafihzAmElZusmK5psW0x_RXO2ctQIZ1ouGgAIXwNCyz2mRwBQJuAJHZDzugFFBmFN4Mr46yYAGJwVKEeHl50t9_5klltOaNApcdmQGJ3RhIztsvUhYzXQ1_rnjS8aGWHdYMzYG-BnQCN9xnYRcPSOgUWvtPyOwDsZnsa80EJ39RWa-0UCysq1toIH3mqEK9XyG6gLoWY854FUQo1EnWvwY-vsGJTBC2-2A065WqCkJPgjDqIVlbNjWHDnS8H_5qYMeV0ZTAgHp8ja0NaMMWWukNgyMM9YpahY0KZf7AeUyw0eNYqQZI10LkwWn2hUPtpjyZ7siY11A4mTS6pwwnSfqn0e5m8J71K09ymefUiC96sE77ME1AQJ09L1ZvVqiKvX8idLVjS0nI5meh6cPTl-vhyg5npwDuGXCU6ZhmpUsNcUePTzkU6HZTe39uKYlMRXsPh_nVwHSw1yPSxior9s-otpPWWYbEn8S7RJ2RvveUfVxtTejk5g1HBSe0frLGJc-FM42sNmdSZF7sZZVjQ_PwcUASXYMQxjeBx5NF54ToemaGDubyIyl71ooF0-3SU5am5OhEGOAv1jjmXYO9ffPYIP3EjuJHj-5e_mNG_tGOKaipX1SiwGJdgOsm0xC7ItIKt-sM1LUbxSVcoiZ3mZr0negTt-cnzooazS8wmhfN1l1eER8tE64GCsEZY7x79uSi7sebCG8t-C9fjfEY1AgmUHdDwoazwJx4dBK5Q5ZYlVreFXF73nWDYt_OFOxSzkNnWKjKMq0JLE6-IUjf09mh4jHvwc3EPI5OIc-sEamd6L_wIHPlToo9nzM4L8MvysRBoofBr6Ue8zBnQeuP8HdDmRSCS5gaj6TPu71K0djfQ5_F5G-zclQo9m6iWUEOz_pcboyS6xU-S86EiVNkoUmjucpHjA1HMPPNpeIoNnkQTdXDy9nmbO1wjx1Wvk81PR2XTdualLxMDDklPo0X0oj_ld8__HplOVJtO2AN_bUUto8Vkd7rOQa5wT2wI65XyAFjvrEATXmlRL-jzwzbbFNCW2RSyogdaGntYX7zSKSsoEN4rgQcXbXeqH-d4w48VPFCOdlZXcr2W9rvkK9-XrZrfZlmW9WfX78rUrN11bsLra4bYTXb3DWtTIWlqucaX2rGBVUbFdWa_rapNvW0Qh63rTbeqqrHbZpsAzVzrX-s85t-60Ut6PuC835W5drTRvUft4T2Wso1GZrZvOWbp5xDdqdVi5Pfm-tOPJZ5tCKx_8HC2ooOM9NzlXB_hlYp-KQLen6eJEs2aeQB8k3zdCK7-4bVGvPJ1t-Wp0et-HMMSJzo4ZO55U6Mc2F_acsSPhm75eBmff6V3OjpG6z9hxYv9nz_4XAAD__1sSo8c">