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

    <tr>
        <th>Summary</th>
        <td>
            [flang][OpenMP] Memory leak in first private declaration of a derived type.
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          scamp-nvidia
      </td>
    </tr>
</table>

<pre>
    Consider the following code: 

```
PROGRAM DRIVER
    use omp_lib
    IMPLICIT NONE
    INTEGER, PARAMETER :: NVAL = 2000
    TYPE TCONTAINER
 REAL(KIND=8), ALLOCATABLE :: ARR(:)
    END TYPE TCONTAINER
 TYPE(TCONTAINER) :: obj
    INTEGER :: idx
    ALLOCATE (obj%ARR(NVAL))
 do idx=1,4
        !$OMP PARALLEL FIRSTPRIVATE (obj)
 write(*,*), 'thread', omp_get_thread_num()
        !$OMP END PARALLEL
 enddo
    DEALLOCATE (obj%ARR)
END PROGRAM DRIVER
```

Compiling with a recent version of upstream Flang and running this code with valgrind on an icelake machine (x86): 

```
[scamp]$ flang test.F90 -o test -fopenmp -g
[scamp]$ export OMP_NUM_THREADS=2
[scamp]$ valgrind --leak-check=full ./test
==3579486== Memcheck, a memory error detector
==3579486== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
==3579486== Using Valgrind-3.25.1 and LibVEX; rerun with -h for copyright info
==3579486== Command: ./test
==3579486==
 thread 0
 thread 1
 thread 0
 thread 1
 thread 0
 thread 1
 thread 0
 thread 1
==3579486==
==3579486== HEAP SUMMARY:
==3579486==     in use at exit: 210,753 bytes in 24 blocks
==3579486==   total heap usage: 796 allocs, 772 frees, 1,756,205 bytes allocated
==3579486==
==3579486== 64,000 bytes in 4 blocks are definitely lost in loss record 11 of 13
==3579486==    at 0x4C3E2E1: malloc (vg_replace_malloc.c:446)
==3579486==    by 0x501C0E6: Fortran::runtime::Descriptor::Allocate(long*) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD3B47: Fortran::runtime::AssignTicket::Continue(Fortran::runtime::WorkQueue&) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD1ABC: Fortran::runtime::DerivedAssignTicket<true>::Continue(Fortran::runtime::WorkQueue&) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD3E6F: Fortran::runtime::AssignTicket::Continue(Fortran::runtime::WorkQueue&) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD65BC: _FortranAAssign (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x40014E4: _QQmain..omp_par (test.F90:8)
==3579486==    by 0x4132178: __kmp_invoke_microtask (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x40AE59E: __kmp_invoke_task_func (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x40A8BC4: __kmp_fork_call (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x40986FC: __kmpc_fork_call (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x40012DF: _QQmain (test.F90:8)
==3579486==
==3579486== 64,000 bytes in 4 blocks are definitely lost in loss record 12 of 13
==3579486==    at 0x4C3E2E1: malloc (vg_replace_malloc.c:446)
==3579486==    by 0x501C0E6: Fortran::runtime::Descriptor::Allocate(long*) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD3B47: Fortran::runtime::AssignTicket::Continue(Fortran::runtime::WorkQueue&) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD1ABC: Fortran::runtime::DerivedAssignTicket<true>::Continue(Fortran::runtime::WorkQueue&) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD3E6F: Fortran::runtime::AssignTicket::Continue(Fortran::runtime::WorkQueue&) (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x4FD65BC: _FortranAAssign (in /llvm/lib/clang/22/lib/x86_64-unknown-linux-gnu/libflang_rt.runtime.so)
==3579486== by 0x40014E4: _QQmain..omp_par (test.F90:8)
==3579486==    by 0x4132178: __kmp_invoke_microtask (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x40AE59E: __kmp_invoke_task_func (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x40AD1FD: __kmp_launch_thread (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x4111BF7: __kmp_launch_worker(void*) (in /llvm/lib/x86_64-unknown-linux-gnu/libomp.so)
==3579486==    by 0x65521C9: start_thread (in /usr/lib64/libpthread-2.28.so)
==3579486==
==3579486== LEAK SUMMARY:
==3579486==    definitely lost: 128,000 bytes in 8 blocks
==3579486==    indirectly lost: 0 bytes in 0 blocks
==3579486== possibly lost: 0 bytes in 0 blocks
==3579486==    still reachable: 82,753 bytes in 16 blocks
==3579486==         suppressed: 0 bytes in 0 blocks
==3579486== Reachable blocks (those to which a pointer was found) are not shown.
==3579486== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==3579486==
==3579486== For lists of detected and suppressed errors, rerun with: -s
==3579486== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
[scamp]$
```
There's definitely a memory leak associated with the first private declaration of 'obj' at the parallel region. Analyzing the assembly with "-S" and comparing against the valgrind output, I believe for the parallel region, there's a '_FortranAAssign' that allocates at the beginning of the parallel region, but there's not corresponding free for that allocation, leading to the leak. 
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWd9z4jgS_muUly4oW_6BeeDBMWY2t-THMMzc7RMl2wJrkSWXJJPk_vorySZhMiGzc7VzW7cVKhWw6P6-r6W2WrSJ1mwnKJ2h6BJF8wvSmVqqmS5J047EgVWMXBSyepxlUmhWUQWmprCVnMt7JnZQyoqiIAXkpfYv9oY_L71b3X5YpdcwX119yVfISwEAOk1BNu2Gs2IYubq-W15lV2u4ub3Jj2M36_xDvkI4g7t0lV7n63wFKEgt0c2XdAkomAP2PG-wX_92l8M6u71Zp1c3PdcqT5cIJ79e3cxRME8Qnlq0dLm8zdJ1ernMj3jpaoVwYi_wdIDLb-avQdohhJOTQTw9osji96-1H79g1cPwxcCdA8KJNcdRT20DcvIcfSWdSzD3Ec7CwdW-EPYRDm-v79yULJf5EhZXq0_ru9XVl1NUh3KvmKE2LJwinLn_Ln6EJ6ZWlFQIT-y1XYodNZt-cCO6xjlNX-W103LktgZUVJUcLOf5mfAslHN8mQ2nqYK8NJNNy7jNqHtmaiCgaEmFgQNVmkkBcgtdq42ipIEFJ2IHRFSgOiGsj6mZdqnYex8I3ykmKpACiABWUk72FBpS1kxQq_Ahia22VxMXRZcu_VE0RziErWMzVJvxYurBSLrPMNrKloqmhdHuWx_60Epl4Pb6bnPz-Xqz_mWVp_NPKJjjb22fxI5GnJL9qKxpuUfBfNtxDmOEF5bOugU2k4NoMg2TuL-Aa9r05jgDAg1tpHoEqpRUUFFDSyPVGc9Mto-K7WpjZyOzmYw9D4-wh0MHJir4cPMZPtwtEZ5Udqh4hH90nBEBn-g9URVQA4SPz-B_1nZdvgyxjYIxjsa-g12y4kv-LxRcgqKqE_2KjWrYSgXlkyomtvKs9KYhorKL9_b02NzsMxu8k8_-nzj-Outrqn_J0zv49Pn6Ol39ZveG163siwm3TRID9IEZGyb2PYSzSRRA8WiothY4hILLcq_PAhlpCIeakhY6TXZul55MYyCcy1LbFZ1MMGwVpe7Cdwwxwhn2ooHHmRJDqx-KNLYZ5Hnes9ijViCKQkW3TDBD-SNwqe1K23dtb3ipKvB9e6_7wfkJIga8hzALcpz7NqjGybR5fNhtFG05KemmHxyXKEjDMO73oTN4xSN4D5HnZ14eW7yFVEYR0W_gqhOGNbS_mFNdKtbau8pdp8P8IJxwKXb9PmuFMAEILzg_NPaNFQgvSruNILzA-GnoIYk3cTjqxF7IezHiTHQPo53oegO372yUGQ8SxlqeD8PFEC7mwWU4eTuG1BX8NSv31PQjmRSGic5Gcd7tn1LtP3bUWsV_dZB-epl9b6EUO9Dq61gzozqKgvz_NOogjxd_-6WNo35pN4PcIaa_UJPn-WEeOk0fPzaEifHYnppaoqyo47EABWny_U0m9APsTxIHttk37YaJg9zTTcNKJQ3R-zNxvh2UbNo343hi99I8mubfsFvizbYT5c9mTy6z8Jl9K9V-UxLOfzLtNIkX2RNt-T_j9Xw8X5zkzR9Ol59TVvF7WX0vq-9l9b2svpfVv1lZnfuL-TM7J50o66Gj83Opfd-_XEy-ob6Xak-VrRuSVW9u3n-OjjiKsJ-5Zo42RJlvYu-06hFtCbXvbW8xwmOcvEVxhniZp7_-oZ_yL2qyVejj5GUZT773Sx6YqJiipTnBOfH33vZvpdas-K9cAUAbxjkoSsqaFNw1ERL8shnhx9_FcS_dta2iWtPqx3SsjvTHA4_dImqpKRgJ9zUrayDQSiYMVXBPNGxlJyqbd_ZkJKQBXct7ca5XtZagKQVT0wbh7KQtZVW-1pUbjSxe_8WeiUqjYE44_6EkWkgFnGmj7bmsb9bRyjXInmepb-XpV0Sdm6l8tbpdneQm4AEDtko2gKGUwtAH46bw5XI4E2-4G75qUr7okK5rqijCE32a4U_9RzstQLSWJSM2Jtfgc08NmNIGWsUOxNgDa8mJImbo7iI8cW3jiT2IWuuWKMI5tcm3Y1KMIRWEP_67b_dSS0Abm9YOHmE8-oQwdhNYyqYlyhqSHWFC93jPTeHOtJ2xk3oFBeWMHqhrPr5Cao3MU7DEinxRQq1gUxPz1CvTR_0F3bG-Oy2357CLzpzg20QtpVJUt1JU1nOr6FHbM8XgyylxNkY6dDvrY7ioZkE1Dabkgs78iU2NaRxGF_UspP50QmLf3xJcbOOC-gnB8WRbkiT0yzi4YDPs4cib-pEfYS-MxmGRTPzQwx6dhME0maLQow1hfGy38LFUuwumdUdnfpTE0fSCk4Jy7R4jYbztTxAYRfMLNbMOo6LbaRR6LuWfIQwz3D176j2iOYoub1sqru9Q5NrbTwnFxNv5Q6DqT6dgHls6vugUn9XGtNo92lkgvNgxU3fFuJTNSR2y0lolf6elQXjhItIIL4agDjP8nwAAAP__W9wLXQ">