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

    <tr>
        <th>Summary</th>
        <td>
            [Flang] Incorrect execution result when reshape intrinsic function is specified as the argument of function
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          ohno-fj
      </td>
    </tr>
</table>

<pre>
    ```
Version of flang : 21.0.0(842e5915778a820c63cf38b75bec932a6ea8c18b)/AArch64
```

When `reshape intrinsic function` is specified as the argument of `function (ch and s)`, the function result is incorrect.  
The above program is Polymorphism_22.f90.  
Once the result of `reshape intrinsic function` is assigned to a variable, and that variable is specified as an argument to `function (ch and s)`, the execution result is correct.

- Before modification
```
  call s(ch(reshape([2,3,5,6],[2,2])))
```
- After modification
```
  integer::res(2,2)
  res=reshape([2,3,5,6],[2,2])
 call s(ch(res))
```
The above program is Polymorphism_4.f90.

The following are the test program, Flang, Gfortran and ifx compilation/execution result.

Polymorphism_22.f90:
```fortran
program main
  interface
 subroutine s(unlim)
       class(*) :: unlim(:,:)
     end subroutine s
 function ch(dum)
       integer,pointer :: ch(:,:)
       integer,target :: dum(:,:)
     end function ch
  end interface
  call s(ch(reshape([2,3,5,6],[2,2])))
end program main

subroutine s(unlim)
 interface
     function fun(dmy)
       integer :: fun
       class(*):: dmy(2,2)
     end function fun
  end interface
  class(*) :: unlim(:,:)
 integer :: stat = 0
  stat = fun(unlim)
  if(stat/=1) then
 print*,101
  else
     print*,'PASS'
  endif
end subroutine s

function fun(dmy)
  integer :: fun
  class(*):: dmy(2,2)
  if(sizeof(dmy) /= (4*4)) print*,'201'
  fun=0
  select type(dmy)
  type is(complex)
 print*,'202'
  type is(integer)
!     if(dmy(2,1)/=3) print*,203
 print*, "dmy = ", dmy
     fun=1
  end select
end function fun

function ch(dum)
  integer,pointer :: ch(:,:)
  integer,target :: dum(:,:)
  ch=>dum
end function ch
```

```
$ flang Polymorphism_22.f90; ./a.out
 dmy =  -1431332800 10 -418684532 -878184479
 PASS
$
```

```
$ gfortran Polymorphism_22.f90; ./a.out
 dmy = 2           3           5           6
 PASS
$
```

```
$ ifx Polymorphism_22.f90; ./a.out
 dmy =            2           3           5 6
 PASS
$
```


Polymorphism_4.f90:
```fortran
program main
 interface
     subroutine s(unlim)
       class(*) :: unlim(:,:)
     end subroutine s
     function ch(dum)
       integer,pointer :: ch(:,:)
 integer,target :: dum(:,:)
     end function ch
  end interface
 integer::res(2,2)
  res=reshape([2,3,5,6],[2,2])
  call s(ch(res))
end program main

subroutine s(unlim)
  interface
     function fun(dmy)
 integer :: fun
       class(*):: dmy(2,2)
     end function fun
  end interface
  class(*) :: unlim(:,:)
  integer :: stat = 0
  stat = fun(unlim)
  if(stat/=1) then
     print*,101
  else
     print*,'PASS'
 endif
end subroutine s

function fun(dmy)
  integer :: fun
  class(*):: dmy(2,2)
  if(sizeof(dmy) /= (4*4)) print*,'201'
  fun=0
  select type(dmy)
  type is(complex)
     print*,'202'
  type is(integer)
! if(dmy(2,1)/=3) print*,203
     print*, "dmy = ", dmy
     fun=1
  end select
end function fun

function ch(dum)
  integer,pointer :: ch(:,:)
 integer,target :: dum(:,:)
  ch=>dum
end function ch
```

```
$ flang Polymorphism_4.f90; ./a.out
 dmy =  2 3 5 6
 PASS
$
```

```
$ gfortran Polymorphism_4.f90; ./a.out
 dmy =            2           3 5           6
 PASS
$
```

```
$ ifx Polymorphism_4.f90; ./a.out
 dmy =            2           3           5           6
 PASS
$
```


</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkWN1u4zYTfRr6ZmCDGkqyfOELxf78oVddYIv2sqBpyuJCEg2Sym769AUpyT9KnESLTbtADSPRDzlzzpkRj0xurTo2Uq5J8kCS7Yy3rtRmrctGz4svs70-PK1JSvsvzX-XxirdgC6gqHhzBMJywGhBF5RglsUok1WULJcZz5CKlImCZftlspdixZCnkmciyvYEVwR3eW5EmcaE5tcZCM3_KGUDJKVG2pKfJKjGGdVYJaBoG-GUbkhKQVmwJylUoeQBuAVXSuDm2NaycR4fSekwHAhmogTeHMD63CkluAkTziOMtG3lfFDVCG2MFG4BQGj-mw-7148STkYfDa_9mE-6eqq1OZXK1n8iLooV7Ub_2ggZAvfxOhxvEunLcACngcMjN4rvK-lBesyu5O588Rlv3lxoO_0-2vKbFO2I98C6q8EcHmShjYRaH1ShBA9ob0sFIHhV-diZKAlmPU2CGUkekOCGEdwkBDcpSbYEN_1VDGer_nsbcg554aR5PatqnDxKQ1hOWG6kz9_FDeHAcyJsOxENzZ-zeRHi2w0Rh37odPSjC11V-qtqjsBN1x1OWjdM9zXZ-WfJH_y_0MYZX9LmAKr4BkLXJ1V1OuBuXLc-yQvt6MW5wt2HJTQfQNdcNWc1TcGF9Ge23RvdOtXIIETbVKoeZA0fUXHr7xDMCa6gqwH04zJ_ipvw9zxH-va7Dkvzy2MXlD60tzmG-uLmpAO6IU0Y_VKO6zmOm6N0w5QQ-y6uaxz-sr92o8eP6XAfdqQ7ofkrWt9iALgALdrGK1Y_vcR-IO0H3anYIIsPcPvUjCUZgrygyaQeGGGzjvvibKF7ls-nHbGbhlMFwcwPILgjbBv5ZK6UAdbJqMYFAJuIRh3Qyp71urpNcPkp__yZ4HKgo4q-JqO2JDS_r_Mdid-rbsdF_SV1cY4LHS-_TMcE87jrlxF2pNEA3edk2143WUnhwD2FbrzC6a-ACh2r61Mlv_U3xlFxiHqZcH6GwpKHUddaZ7yBUNR5N2FbNsKKlI3yAEE81E_QcfSzgzKXlg5FHXqsY9RXZtSF15UZLxkTV4uJC4UoCdsS9j9_ewQtrBmjV5ebU4z7l6QX1-cHWBDc8YVuPWkYhIJ5FLOIMcwohYjCPI6yNIsThjDPllmUxfEyQAtNHbK8DeM42MoUJAiXD7s6Tq6O06lIvKdNkuPyuY_nbRQjj4wnWeSz1fgfcsmbhf8HOOUHeeRHvY698j422VAnOOrP7KUfZKYjx5xkqP9VP30uyvs8daqfjvL8jJ76r1tq_LqFILB3mcS7TPONXPfs6sea5neC-E4Pnx3W7LBiKz6T62gZpymlaZzMyrXky2TFMhQolihZshJxXMhkz6jAmEZyptZIMaEJXdI0oXGyiIv4kMmoYMiKlYxWJKay5qpaVNVjvdDmOFPWtnIdsSyL6Kzie1nZsDmFWHQ_kr1DzMzaT5jv26MlMa2UdfYSwilXhR2t7md1soVfhj2d5zsfX0sZju9s0Ly5zTQMnLWmWpfOnWxo9R3B3VG5st0vhK4J7jy6_t_8ZPQX_1ziLrC1BHc94cc1_h0AAP__-GV85A">