<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">