<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/72464>72464</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Failed to dynamic_cast when compile with `-fvisibility=hidden -stdlib=libc++`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
libc++
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
timxx
</td>
</tr>
</table>
<pre>
It's very simple case:
Write two abstract classes in shared library, used the shared library in main program, use `dynamic_cast` to cast the abstract class, it fails.
sdk.so
```C++
// sdk.h
#pragma once
#define SDK_EXPORT __attribute__((visibility("default")))
class ISDK {
public:
virtual ~ISDK() {}
virtual void foo() const = 0;
};
class ISDKV2 : public ISDK {
public:
virtual void bar() = 0;
};
SDK_EXPORT ISDK *create_sdk();
// sdk.cpp
#include "sdk.h"
#include <iostream>
class SDKV2Impl : public ISDKV2 {
public:
void foo() const { std::cout << "foo\n"; }
void bar() { std::cout << "bar\n"; }
};
ISDK *create_sdk() { return new SDKV2Impl(); }
```
demo (links with sdk.so)
``` C++
#include "sdk.h"
#include <memory>
int main(int argc, char **argv) {
std::unique_ptr<ISDK> sdk(create_sdk());
ISDKV2 *v2 = dynamic_cast<ISDKV2 *>(sdk.get());
if (v2) {
v2->bar();
} else {
sdk->foo();
}
return 0;
}
```
In above example, it should prints `bar` but `foo` instead.
It's strange when removed the `-stdlib=libc++` flags, it works just fine. (GCC also works as expected).
If I add the `SDK_EXPORT` to the two abstract classes, it also works (or just use `-fvisibility-ms-compat` instead), but I don't want this way, it exports too many unwanted symbols (the vtable and typeinfo)
[bug.zip](https://github.com/llvm/llvm-project/files/13371442/bug.zip)
Extract the `bug.zip`, run with `cmake -DCMAKE_CXX_COMPILER=clang++` , build and run to reproduce the problem.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl2P4rgS_TXmpQQKNh3SDzzQCVyhuaMZzVzdnTfkxJXgacfO2g40-7C_feUk0IHuntFKUTfEx_VxquoU3DlZacQVeXgiD9mEt_5g7MrL-uVlkhtxXu08oUsHR7RncLJuFELBHRK2JlFGouHvH1Z6BH8ywHPnLS88FIo7hw6kBnfgFgUomVtuz4Sm0DoU4A94dxTANZcaGmsqy-sADVggcSTOmtey2BfceRJH4E0IxHdWbp2GW9JDyaVys3GUTjzPnBnexFH_pIQ-hWeEI3RL6BYC_HB5wxrLq5qD0QXeYpnAUmqE79mn_ebH1y_f_gf7Pffeyrz1uN8TmhCaHKWTuVTSn7vvVGDJW-UJpYQ-Ds_IbJcI7L5nn4Ash-CaNleyuDIPR2l9yxX8HWCd1ccOvMwGwBVxNFJAacwAKox2HgjLICLskvkye_18F8L_KRC2ht7_b4K69ZlzewnsN95G7PUO6LqwyD3unXjubdzdGFWpaJq7mkhdqFYgEEr7MlL69oyl0jhvkdeEbd6m3mW-qxt1n33g4-P83-V6-QTOiwBj68K0gf2UsDTEF7APqQ4RsicYV--OwV_YCKh3bLyl-SNuO-sWfWs1aDy95n6lfmT1MjpjwwJrA4QmSupnByfpDzCM27WxL9fgduR-Vax3SlZjbez5rmBS-044CE3CR26rIqhAceA2ZEvomtvqeBmQgd8rma2Wf7a4b7wlLO2GiW2gp-ZND47aEK7NQNdH2nX4jUj1tvrzEC9NQnYV-ndMyTKQd6R3IQIc6ZSwzbULRs7JMgNUQRzHeCeew4VrA95eGHN2KfftVH5c4Z0GnpsjAr7wsAcGmXUH0yoBjZXauyDUIdY4gjw0aByFQOIIpHYeubiR42G1BOnWFcLpgBos1uY47AYSR1PnhZI5YZmSeTG0TRxBqXh10fmTsc8OfrbOQ9DhWSDyP2kKXDkzHHIH-NJg4VEQ-ngbRAk74OLq8VWHhiUT3r-32AbvIy-EJsb2gQw7a1q-yv60dtPC1A33Iz66Nkg7rnYgjCZ06eHEdVhr0sGJnwc3-NIY6x14Y6Dm-gytDjAU4M51blTnPYR69DxXCFwL8OcGpS7N3WohD095W83-kg15yAhNDt43LgxCp6eV9Ic2nxWmJnSr1PHyb9pY8xMLT-i2lCqkv50ztpwvFpTQ7cXgxdPmpedqIPVyHEchHdvqXiBIHBU1f0aYZunn9afNPv3xY59--fx199_NN8KyQnFdvRa9Z0oq0WUXrHgDFhtrRFtg56uxJldYzyZixcQje-QTXM2XUTSPoiVNJodVVPKSlQku6EMiYuSMzh8Zw6Sc88VysRQTuaIRZfP5PI7onEbJjAmWRPGcxnOBdF5EZBFhzaWaBVZmxlYT6VyLqyVdxIuJ4jkq1_2conTUs5SGn1d21VGZt5Uji0hJ592rGS-9wtWWSxX639xoST8coX2kwit54_YiLDtIIVDDBzMzaa1a_etad7mFYnfp_RMAAP__7Nn3Cw">