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

    <tr>
        <th>Summary</th>
        <td>
            [Modules] Defaulted `operator==` leads to duplicate symbol linker error
        </td>
    </tr>

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

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

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

<pre>
    Given the following valid set of translation units

```cpp
export module a;

export struct a {
        friend bool operator==(a, a) = default;
};
```

```cpp
export module b;

import a;

void b() {
        a() == a();
}
```

```cpp
import a;

int main() {
        a() == a();
}
```

And compiling with

```shell
clang++ -std=c++20 -x c++-module -c a.cpp
clang++ -w -std=c++20 -fmodule-file=a=a.pcm -x c++-module -c b.cpp
clang++ -w -std=c++20 -fmodule-file=a=a.pcm -fmodule-file=b=b.pcm c.cpp b.o a.o -o /dev/null
```

Causes linking to fail with

```console
/usr/bin/ld: b.o: in function `operator==@a(a@a, a@a)':
b-03d00f.pcm:(.text+0x20): multiple definition of `operator==@a(a@a, a@a)'; /tmp/c-1a0bef.o:c.cpp:(.text+0x20): first defined here
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
```

To work around this bug, you can declare `operator==` as `inline` or call `operator==` in `module a`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVcGO4ygQ_RpyKdnCOHHigw_JRN7T3vYHylBO2MFgAU7Sf7-CJN0zvelDSyPZxlQB9eo9CjAEfbJEHdsc2Oa4wiWene8UXrQK0VlaDU69dX_pC1mIZ4LRGeOu2p7ggkYrCBTBjRA92mAwamdhsToGxo-M7x_fht8fOc93C91m5yNMTi2GAFl9-HX8wxuiX2QEBLZ9d7ej12QVDM4ZcDN5jM6z-pgesUMmfgAy0QKrj6BoxMXEj8W3x4__J6Tv4Bw-4dRT9n6Gf3FawcDELgP5BTs-bRkvPLq_4fsOuC_CaxthQm3_NIC9VSDdNGuT1L_qeH4JL5zJmLtNGrQnJg5MHKAIUbH6KO9dwaG4waNTPOgtJGD5nt1vk68v5o_3acWoDbH6iOktZzm9Xnn4Iyt_8gzpzR6ZloehdIClg8IBE72iCxO9XZ50vGT1By6BAhhtfyZao4MRtfmaXulscIYeVtEvwTPRD0nu3ihW7xOI1GgL42JlrkjW8E-1suaY6yW3qWbyT8vEltWPkEPBa8X5mPJLRrErI90iEwd-Ezzvmz1Mi4l6NpSKTVudo7nxmwEPia04zUz0sqiQDzTmHDKpX4YetQ_xHpcUnMnT_-RNw8j7BGKfKSaftvCEVmWaSWWigW46gnSKoAImdksgKC5Ji0AE2l6czCdbCvy1kv84uDr_E9C7xSqIZx1gWE4p2ze3gEQLiqRBTy_oaThgSHZtjbaU-s6DRGNeD9ZZ1Pfzs-HlSnW1ausWV9RVzXbbVOt2w1fnbhy43A4cR9oppVrELW-but60tcJmvZYr3Qkuai7ETnDeVrxcK9WM1YDNtqrqSmzYmtOE2pTGXKbS-dNKh7BQ11S82a4MDmRCvkCEsHSF7GRCpPvEd2lOMSynwNbc6BDDxypRR5Nvnr9zHoFtjnC8H9qkXudtCFVIyqhlNlpiJAhv0-DMU94s92rxpjvHOIe8e3om-pOO52UopZtSoZjLsylm7_4lGZnoM-7ARJ_z-i8AAP__e0wJ0w">