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

    <tr>
        <th>Summary</th>
        <td>
            [Flang] Implementation of C_LOC() is incorrect
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    The code generated by the intrinsic C_LOC() is incorrect.  When calling C_LOC() on a variable, the function should return the address of the variable.  

Here's a program that calls the C library function "memcpy" using the results of calls to C_LOC() that illustrates the problem.  This program compiles without error and emits "OK" when executed on gfortran and several other compilers.  When I compile and execute it on flang, it gets a segmentation fault.

```
program test_memcpy
  use iso_c_binding
  interface
    function memcpy(dest, src, len) bind(c)
      import c_ptr
      type(c_ptr), value :: dest, src
      integer(kind=4), value :: len
      type(c_ptr) memcpy
    end
  end interface
  integer(kind=4), target :: src, dest
  type(c_ptr) tmp
  src = 343
  tmp = memcpy(c_loc(dest), c_loc(src), 4)
  if (src .eq. dest) then
    print *, "OK"
  else
    print *, "Bad"
  end if
end
```

Note that the implementation of C_LOC() was done in https://reviews.llvm.org/D129659.

Here's another program that contrasts the code that we generate for creating a pointer with C_LOC() and by using pointer assignment:

```
program contrast
  use iso_c_binding
  integer, target :: var
  integer, pointer :: faddr
  type(c_ptr) caddr

  var = 255
  faddr => var
  var = 127
  caddr = c_loc(var)
  var = 63
end
```

@PeixinQiao, please take note.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVV2vozYQ_TXkZbQogRDCAw93b3rVVatuK620j5ExA3HX2NQ2yebfd2zifNze210JJXi-znA4MzS6PddfDghctwg9KjTMYQvNGRxZhXJGKCs4PO9___ycZNskq0BYcnBtDHKXAnw9oALOpBSqf4jTChgcmRGskZhkz6FkNynuBLnsQU-yBYNuMiq4WNsatBZ0F44xkyCS5S5ZPs2_v6KhYqWl2qPRvWEDRTMXOrAh8RmkaAwz5xtYkmUDDnw80w1M1nfqIwluki4gXtL1wxOEwkLKyTrPy1yeUKmrgdr6ciAqYhNcD6OQFHMSjh7NARqjDTDVAg6CQAj6828e_-QJw-_IJ081ddd32hCACsEWj_QSJGjCMrGqsZHoT9E0V56rgHC-TieZ6j3RdOzReYos9gMqxwILHaOnTe_JTDbLyxWOV0LRuv2FsOAAIo1QrN7zfSNUSwRGB2kETcc4RgPcaI-cb1sq6Buzhvs_icrT6yuRk0zVLZkqDiPxAXw_OnNvd-cRfXiwUwoVOjI5IST5E11wD3JfjhrskTK23zxevlu_lexbeh8LHskAQKp0OdDtf0l4F9QxQ68mol74CJ1fMl8ju2GMLoqmxB3k6_waPYzBdGWa76XmV8YDZDQFsGBZ3zEuOph9kOI_6YVEL_17QkZaA9R09uSzo5CvBEiL74d-ZO19rCerm09XDl-pcP79Q5OuwwCGTTSMNHNXJdPA3s_piVlotfILCw7OjdbTm73QZfAo8GRTKY9Dqg1Nx8tulVWbokrfXipqnrvH1aJpDzLr5vkPqzLYT7eVCTTCwA1Se7RbaDXpIImwDB5a9VNL23XeQTGKWSt65R_PN_7j-YwN_dRwBhm-Fh4t1zdiYj-XoM5v5Pd0yW_OGEJFgxizooimUMIbk_yXe9AYusrKaOIx9CpYH38TakzZ5D8jn2S9_BPFd6H-EkyHZ5PIiCbHviHQS8Z0gfVqsynzvFhvqkVb522VV2zhhJNYJ8XHl7BNix18-l_t3X8NF5OR9aMAexLA1KS0tOngVXj5-0Dv8m9KoaOwdkJLN8W2zKvFoe7KqtnkbFU2Ba45q9i2XHbVKsOqyEq2wYVkDQ2db5JGS-EJQgk_ZsVuIepsmWWr1XKVLdfrrEq3TcO7cl00Zcn5alsSNTgwIa9DsTB1aKmZektOKUjqN-csTgyc-Ppsou-bqUfrUKgOZbsI6HXo_l_86Y1X">