<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58560>58560</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang++-16: Linking error when importing virtual classes.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mls-m5
</td>
</tr>
</table>
<pre>
I get a linker error when trying to import and inherit from a virtual class.
A minimal test case. (Could be smaller if the std-lib stuff is removed)
```c++
// base.cppm
export module base;
export struct Base {
virtual void hello() = 0;
virtual ~Base() = default;
};
```
```c++
// derived.cppm
export module derived;
import <iostream>;
export import base;
export class Derived : public Base {
public:
void hello() override {
std::cout << "hello from derived\n";
}
};
```
```c++
// main
import derived;
import <memory>;
import <iostream>;
int main(int argc, char *argv[]) {
// This does not seem to link properly
auto derived = std::make_shared<Derived>();
std::cout << "hello from main" << std::endl;
derived->hello();
Base &b = *derived;
b.hello();
return 0;
}
```
Building with
```bash
clang++-16 -std=c++20 -stdlib=libc++ "base.cppm" -MD -MF "base.pcm.d" --precompile -o "base.pcm"
clang++-16 -std=c++20 -stdlib=libc++ "base.pcm" -c -o "base.o"
clang++-16 -std=c++20 -stdlib=libc++ -xc++-system-header --precompile memory -o "memory.pcm"
clang++-16 -std=c++20 -stdlib=libc++ -xc++-system-header --precompile iostream -o "iostream.pcm"
clang++-16 -std=c++20 -stdlib=libc++ "derived.cppm" -fmodule-file="iostream.pcm" -fmodule-file="base.pcm" -MD -MF "derived.pcm.d" --precompile -o "derived.pcm"
clang++-16 -std=c++20 -stdlib=libc++ "derived.pcm" -c -o "derived.o"
clang++-16 -std=c++20 -stdlib=libc++ "main.cpp" -fmodule-file="derived.pcm" -fmodule-file="memory.pcm" -fmodule-file="iostream.pcm" -c -o "main.o"
clang++-16 -std=c++20 -stdlib=libc++ "base.o" "derived.o" "main.o" -o "build/default/main"
```
Get linker error like
```bash
/usr/bin/ld: main.o: in function `_ZNSt3__120__shared_ptr_emplaceIW7derived7DerivedNS_9allocatorIS2_EEED0Ev':
main.cpp:(.text._ZNSt3__120__shared_ptr_emplaceIW7derived7DerivedNS_9allocatorIS2_EEED0Ev[_ZNSt3__120__shared_ptr_emplaceIW7derived7DerivedNS_9allocatorIS2_EEED0Ev]+0x1e): undefined reference to `_ZW4basedlPv'
/usr/bin/ld: main.o: in function `_ZNW7derived7DerivedD0Ev':
main.cpp:(.text._ZNW7derived7DerivedD0Ev[_ZNW7derived7DerivedD0Ev]+0x1e): undefined reference to `_ZW4basedlPv'
/usr/bin/ld: main.o: in function `void std::__1::__libcpp_operator_delete[abi:v160000]<void*>(void*)':
main.cpp:(.text._ZNSt3__124__libcpp_operator_deleteB7v160000IJPvEEEvDpT_[_ZNSt3__124__libcpp_operator_deleteB7v160000IJPvEEEvDpT_]+0x11): undefined reference to `_ZW4basedlPv'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
It is possible to create include-file of the `base` class, but for my real example that solutino would not work.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9V1tvqzgQ_jXkxSIiECB9yENuXXW1e3Skc6Qj7QsCPAneGoyMSdN_v2MbEkjTqtt2NyJc7PFcvrl4nAn6vHwgB1AkJZxVjyAJSCkkeSqgIko-s-pAlCCsrIVEoooSVhUgmSJ7KUpcdWRStSknOU-bZup4W8db2fuKlKxiJc4paBTJ0wamxPEXG9FySjIgDc5xlMj2RBX4qajLWYbPdr8nrCESSnEE6vh3Q7ZO5Nkrd_y1vuyof48XybSQvK5LOwono3YpaMvBTDrBesisI2iUbHNF1khAnLijIPjrrTsKRkkBnAs0ABUiTrAl3pnZkNSJd5rPgI7CPm25uoiOt5f33pp3m0gRfURlYOUtWzuqK3M7NzrBhgm0GdLSCXZnmo5DR_Q6WsbVZGslILMVqduMs_wKPzuI0wOMrmFE_0rJ6BXq-ofRoJcGq1y0RmO8MHp8s9oGX29juKlwYuQMDfFLrD-IeJmyaoTfNbgXWEsMWfk8BPVtyDuaSlkh_kK_pvKAamxIXqQSTV7h99EJ1064NRE1RKrT8GeB6UIFNKQSGM0ApU5andCklqIGyZ8va9IW5-jZe9sL1GX6CEmDUrVtm21v5c46awTwO9xjLfL7yfMKqCgf8ep0cVHSIDauMNKENr78KDNqIzLXjtBE2fRtJhJUK6tB8l5i5VZkrFvGqa6CT0wVV3SYIt0QpkR1sKHjziLiGmO3XTD5nhnA2oZjeO-GNVyXeoVAEffPLf7vzxN1Xk6pnXFrCbkoa4a57QoyJNGx_3klLCPEx81HAoRx4cf5u6fuzW2eGwWlW0CKbhtbZNOG9ILtZ6_Sfy28z8uz-H7gS8AdlWvjyr0t0e4ehSP5S4G3SIY-GoRJz_3tSBlQfRLQl8yGAdNPfTZmdAhg8dCYvQbZlRY3KMZB9A7UB4YY6Z-14jqHrvEZijmnnK42WNH7lsG_P1fR10vUb9i-jZo3zh7h5u52KVjIuW0k3jPN_p7r2kw6ffCNVWTfVrlioiK4Lvnr2w8VJMnM95Jug0hqJRMoa57m8PAr7kyLu03j24_kDps7kadKyIcffrLb7bbe7uj48bkhOLsYB_zFVMFJTb9OULj-Ql4YLmvvNAOzo6xIW6F_WIXbp4Q9SKhy0PutAerXXLuc8u_G1o9h_UKzd0J3e51B4pWp_9Mw0_yduwD0S_-ic6auE92naOQTChwUoN5pxpDgOIs8_Gllg41mghu_bUr6D1T-3XE1f03eOu4EPfz-_YieP27rn8kojP7t0g7c2cfAtTUH15mc1i9djmNxL_VBbJ9iKaOmLyFwwhNZLrCRnukjVot9knvU3LEXRD8cdUyjGy5HqVt15EHpU1ctmoZl3OiWY31UmkHOW2prJxH2tGarCeDDngd0w5phK7jH-lM-o4l4FIJTirmGnIoUu1LBW8UqQZ7M-U83qk9CPnZHxgksZ1EUhUG08OMJXQb0LrhLJ4opDstx-dVQ_IFQ6KZscFi1jbYeHB1JoZlOWsmXhVJ1Y0JCd8wHBK3Npgiljlt-7B-4eYq_IdeFlzVNC2jWfbgII29SLMMYwhD8RZx7Ic38nMZpls_jbJ5FkHmUTniaAW-WtlWfsKXv-f7M84PZPAzm0XQRzbx5kMNsPs-CKIiduQcYq3yqBU-FPEzk0uiQtYcGJzlrVHOZRFvYoQLo-WMbXwi5LHnjluHEaLs0qv4D0Ge3Bw">