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

    <tr>
        <th>Summary</th>
        <td>
            [Flang] Unexpected generic interface symbol reference causes error in mangling
        </td>
    </tr>

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

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

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

<pre>
    Consider the following module, simplified from a real module of OpenMPI

```fortran
! mini_mpi.f90
module mini_mpi
 interface
    subroutine mpi_allreduce(sendbuf,recvbuf,count,datatype,op,comm,ierror)
 real(4),intent(in)::sendbuf(10)
      real(4)::recvbuf(10)
 integer(4),intent(in)::count
      integer(4),intent(in)::datatype
 integer(4),intent(in)::op
      integer(4),intent(in)::comm
 integer(4),intent(out)::ierror
    end subroutine mpi_allreduce
  end interface

  ! Generic interface
  interface mpi_allreduce
 procedure :: mpi_allreduce
  end interface
  contains
end module mini_mpi
```

And the following three modules, each one in a different file (stated in the first comment)

```fortran
! comm.f90
module comm
  use mini_mpi

  contains
    subroutine my_sub_in_comm
      real(4)::sendbuf(10)
 real(4)::recvbuf(10)
      integer(4)::count
 integer(4)::datatype
      integer(4)::op
      integer(4)::comm
 integer(4)::ierror

      call mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm, ierror)
    end subroutine my_sub_in_comm

end module comm
```

```fortran
! math.f90
module math
  use comm

  contains
    subroutine my_sub_in_math
 real(4)::sendbuf(10)
      real(4)::recvbuf(10)
 integer(4)::count
      integer(4)::datatype
      integer(4)::op
 integer(4)::comm
      integer(4)::ierror

      call mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm, ierror)
    end subroutine my_sub_in_math
end module math
```
```fortran
! mesh.f90
module mesh
  use comm
  use math

  contains
 subroutine my_sub_in_mesh
      real(4)::sendbuf(10)
 real(4)::recvbuf(10)
      integer(4)::count
 integer(4)::datatype
      integer(4)::op
      integer(4)::comm
 integer(4)::ierror

      call mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm, ierror)
    end subroutine my_sub_in_mesh
end module mesh
```

If we compile them in the proper order

```
flang-new -c mini_mpi.f90
flang-new -c comm.f90
flang-new -c math.f90
flang-new -c mesh.f90
```
`mesh.f90` fails to compile with the following error

```
LLVM ERROR: <path>/llvm-src/flang/lib/Lower/Mangler.cpp:174: not yet implemented: symbol mangling
```

We try to mangle a `GenericDetails`.

It seems the problem stems in the exported symbols my `math` (and `mesh`) in which we see repeated references to `mpi_allreduce` (this suggests we might be exporting both the generic interface name and the external name) from these modules.

```
$ grep -rw mpi_allreduce {mesh,math}.mod
mesh.mod:use comm,only:mpi_allreduce
mesh.mod:use math,only:comm$mini_mpi$mpi_allreduce
math.mod:use comm,only:mpi_allreduce
math.mod:use mini_mpi,only:comm$mini_mpi$mpi_allreduce=>mpi_allreduce
```

but somehow is not a problem for `comm` (which is hopefully exporting only the generic name?)

```
$ grep  mpi_allreduce comm.mod
use mini_mpi,only:mpi_allreduce
```

The problem seems related to the generic interface in `mini_mpi.f90` because commenting it solves the problem. But modifying the OpenMPI module is a bit of an inconvenient workaround.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEuP2zYQ_jX0ZbCGTPl58MGx4yJAghRBH8cFRY0kthQpkNQ6_vcFKVkry_LG215yaBAE0ZCcB79vPo3MrBW5QtySxQeyOExY7QpttkZnwhhRThKdnrd7raxI0YArEDItpT4JlUOp01oioXuwoqykyASmkBldAgODTLYbQGfwtUL15ddPJDqQaNf-u4yav5k2zjDVWukMSqHEc1mJabaJGmvr6LLQGEEohyZjHNtnALB1YnTthEIoK_HMpDSY1hwJXVtUaVJnhO4N8pfmf1zXyhG6T5lj7lz5WnQV7GVJ6F6gMdoQumkD-KIIXc-9he59eH96LZQ3xDsS77og61n0ei786R8Oe7s0rvZ6rzmat8M0efecP3Sqq_IdkXT17jDh8n4UQteuO9BecxcHVXofyHaX3zPA_7LkKfQLKjSC31KkM4y6rYzmmNYGocns4dgAXCvHhLLNs98yStqO9f2cdyodtJYrDGLrwfoOQ8YL0ApBKGCQiixDg8pBJiSCZ7djDn1ajSNhrAMPRLjtzWN95_ff9FwPTajtTTmj1Q878fxs6-RZqOe-s9GeGO-fB1tnjKI37TK2PmiMu37ebIYfcP-G6X1XnEn5hmDBq2LBRbKgp1kQRAta1YKhbI201AgiN8TtLY2R9g39Zq641W7mij6PhoEf5lDP0YP0-Q_y-5Da_jsO_YA-dx38fBx6RaQve51xyJ77vEE7whu0d3jT6tFrnHEejafc8_q_EP0UJOoQ6ZOoM45K0KcMToERlX8LugLLywuwMrpCA9qkaEZFq3nMJFP5k8ITPPGRsfNq-frteH3ySvCul644fdsK3foygowJacHprqKTcMVgMLjBbeDy8-c_vsDHb9--fvPjC4n3le-P-COhRylfyidrOKHHkKI3iYTQ42d98vQ4fmEql2imvKpIvJut5t6F0g7O6MBP-OjHCUy92Z7LREso_RGh8jdA-hPBmbMvK2xGYECWUTugHdD5oskyml4B68AilvaCZSKxBOu8pQUYv1fa-ImnScRCefZugxosIz8RMZVCe8E-I7rxR0-F4IUnjUUEgxWGqclgmKY4htv3h646oPHnCmHB1nmO1lnvohR54SC55OLRSXQLWD6cP0GxEoG1gx5-d2gUk8HqUwtfTa5A2w190zdAJnQOucEKnszpuluBrD6Eiuk-XMXqMC112gqqp5p_inedkNK9VvJM4t3IoDvYH_x1-5vT824apPMxD74v3hPxev-r80ejxgcSfxxxPErMpHZgdYmFPoGwgeisI1umjSdCCNjg31BHWCh0hVkt5bkHvM_vCvgAbHy8N3sPcByAGKSmw238Kh6t8rd-B4WeMigD652-Q1WhQg_05XAZQYKcXVBEFaoW_gLlC1716RQ-1M6zWGTn5lMGL5__F1kXFhgkwoHOgCkQimv1gkr4D5qTNn8zo2uVth0wSbdxuok3bILb2Wq2iqJ4OYsmxTaOM7aYRwlyvlrSZD3Hdbaer2nMsmix4ulEbGlE59GCbmYrulxEU4xxseDrzRJ5jBmPyTzCkgk59dI41SafCGtr3G7iVbSaSJagtOGHEUpbxaRkcZiYbZDSpM4tmUdSWGdfPTjhZPg15RhOLA7wu8LvFXJ_5bd33epop0AQLtk2Ou-RuCjspDZyWzhXWf8Gp0dCj7lwRZ1MuS5bdb-IfGX0X8gdocdQjyX02JT0sqX_BAAA__9U03pr">