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

    <tr>
        <th>Summary</th>
        <td>
            [flang][OpenMP] IO bug in multi-threaded program
        </td>
    </tr>

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

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

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

<pre>
    ```fortran
$ cat m.f90 
Module test
private
public ESMF_TimeGet

type, public :: e_time
  integer :: year, month, dayofmonth, hour, minute, second
end type

contains

subroutine ESMF_TimeGet(time, timeString)
   type(e_time) :: time
   character (len=*), intent(out), optional :: timeString
   integer :: year, month, dayofmonth, hour, minute, second
   year = time%year
   month = time%month
   dayofmonth = time%dayofmonth
   hour = time%hour
   minute = time%minute
   second = time%second
   if (present(timeString)) then
     CALL ESMFold_TimeGetString( year, month, dayofmonth, &
                                 hour, minute, second, timeString )
   endif

end subroutine ESMF_TimeGet

subroutine ESMFold_TimeGetString( year, month, dayofmonth, &
                                  hour, minute, second, TimeString)

      integer, intent(in) :: year
      integer, intent(in) :: month
      integer, intent(in) :: dayofmonth
      integer, intent(in) :: hour
      integer, intent(in) :: minute
      integer, intent(in) :: second
      character*(*), intent(out) :: TimeString
      write(TimeString,FMT="(I4.4,'-',I2.2,'-',I2.2,'_',I2.2,':',I2.2,':',I2.2)") &
             year,month,dayofmonth,hour,minute,second

end subroutine ESMFold_TimeGetString
end
$ cat test.f90 
program main
  use test
  call foo(10)
contains
  subroutine foo(n)
    type(e_time) :: t = e_time(2022, 10, 30, 03, 30, 20)
    character(100) :: s
    integer :: n
    !$omp parallel
    !$omp do
    do i = 1, n
      call ESMF_TimeGet(t, s)
      print *, s
    enddo
    !$omp end do
    !$omp end parallel
  end
end
```
```
$ gfortran m.f90 test.f90 -fopenmp && ./a.out
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
 2022-10-30_03:30:20                                                                                 
$ export OMP_NUM_THREADS=1
$ flang-new -flang-experimental-exec m.f90 test.f90 -fopenmp && ./a.out
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
 2022-10-30_03:30:20                                                           
                       
$ export OMP_NUM_THREADS=2
$ flang-new -flang-experimental-exec m.f90 test.f90 -fopenmp && ./a.out
 2022-10-30_03:30:20                                                           
                       

fatal Fortran runtime error 2022-10-30_03:30:20                                                           
                       
(./test.f90:13 2022-10-30_03:30:20                                                           
                       
):  2022-10-30_03:30:20                                                           
                       
Could not acquire exclusive lock on unit 6, perhaps due to an attempt to perform recursive I/O 2022-10-30_03:30:20                                                           
                       

Aborted (core dumped)

```
@klausler Is this the bug in IO runtime? Does LLVM Flang need IO runtime to handle this multi-threaded case?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWNFy6jYQ_RrzooGx5eDgBx4oXNrMhCZtaF8ZYQmsXllyZTk3-fuuZBtkEnLpTDuZaWEIsaXVnqPdo5XlraKv0yAJm-9OaaOJDMJFEM4CfIMyYlAx2qUhatpWitaCIcMq0zSUmj8Tw9qbeit4hr48rZabNS_Yj6y1an7Na8kCPEetWRDP4IvYxoBpY4EQl4btme46XxnRdkihpMntBSWvane4y1XddHNZG-e7YpmStPHGJEUO0-MAvYZwWfltVb3VqjZcsj51PHHMwKv9_2Q0l_sApx3VxjeetBPAaUfanw_KcqJJZuyU8EQwGcSLAM-sG_BrZystEMC3Tao0XEkifGctdOfyn4wRuLPjwdei4Y3Hzl_X6dz4vY3frvsI5dt4BDpDy8I3cawOII5aD6Uh2xk0jH2DkznwnQ1vqVnVxLOfMEiNyZk8WCM0n93fu2QrQbt8d_aT70U0wInn6qPP2dj3NIV8UYFo-c5Xp1XxOYWeF_G_O68PJ7Z-u1h8t616e_Ln0ls-Pf1dMqCvtEtGvCPQS4b1RHsRs76MLxlyImy_gri6MTlbPToP67cVAz7fNLeJmvjZmS9Xa1ePMHTc3YxuoCnAt0P4g6s7PMJnGjanDRb646bUoaRnRNYqs5NiT5et1g5S8yN0dom81X9n2d_c7E7m7W-lVntNClTAHtHRrCt_w4N8ECHQTimIWRQeJN7fWJDPp7GV_io_v3e4Itc1T3BoozZHFmiOYvcbxsdrHPa8elIBbqEvq6PRyfbhlcUARxAXVZSoBD9CMPFeH1XHVqoQd4wjy0b2ZGvDdLqfukrRo4wQPEJImLaV9dznCbnyoY4EbLrP95xSZ97jQJv77nHn_VtQxr59EGqffQ4iGe5UySQAWRXjBI0CvCQju_waMJuuYRQO43ADWYpnkKR4hsPv19O_-bnCXeGucP8TOFuQ2EsJFQk9rB43P_-22qx_-vXLbPEEhTc62uwEkfuhZN-gTLlLGMQ01F7YmATcsOzzy9mHz5dX1CvqFfWKegnqh0UR_-eKYvO7I0AaLdtnU11Le0pATGulPysLExueLnaAGMWfxSS1h5nPAZ-rWlAklUEk-7PmGnLykom64s8MCZV9RUqiWnKDEvf6k-mclBWiNZwrFYJMEmNYURp7B51w9iiQZlmtnYM7CPDDZ6putgXBMWpfsGUK5kbromT05N3O6SHqJvwqSF0JOGfeVcjk3P4wtK33cP5Edw-deoN4iRaKVej-_vcVWtoliiQDtKOJDUtOJLXvna2fohaGD02uGaFgmJHKehmwaZQkaRKO09t0QKcxTeOUDAw3gk2D8Q9u9QfjBVw-wPpePcK1BWkZnTht3wMMai2muTFl5d5mLOG75yavt6NMFXAjxHP3bwhD_mAZnHCXvKpqBqfc5TjFOBnkU8y20ZjGhCY0mtCI4huKIxbvKI224TbdDQTZMlFZmgHGDdN41kUIY6A64FMrgSjCkzDGSZSOSEgmNIkyGo1jzG7HEHJWEC5Gls1I6f1ATx0xmGEFnYJXpjp2kqrie4i0AwX_pDa50tNHxl-4_IUTNXDTmLo5_AUZIsB4">