This bug hits us when building ICU as a DLL on Windows: $ cat type.h #ifdef DLL #define API __declspec(dllexport) #else #define API __declspec(dllimport) #endif struct API VFoo { virtual ~VFoo(); }; $ cat type.cpp #include "type.h" VFoo::~VFoo() {}; $ cat test.cpp #include "type.h" class XYZ : public VFoo {}; int main() { new XYZ(); } $ clang-cl -GR type.cpp -DDLL -link -dll -out:type.dll Creating library type.lib and object type.exp $ clang-cl -GR test.cpp type.lib -D_HAS_EXCEPTIONS=0 test-97d7d3.obj : error LNK2001: unresolved external symbol "struct VFoo `RTTI Type Descriptor'" (??_R0?AUVFoo@@@8) test-97d7d3.obj : error LNK2001: unresolved external symbol "VFoo::`RTTI Class Hierarchy Descriptor'" (??_R3VFoo@@8) test.exe : fatal error LNK1120: 2 unresolved externals clang-cl.exe: error: linker command failed with exit code 1120 (use -v to see invocation)
Note that we haven't finished implementing RTTI yet: http://llvm.org/PR18951 It looks like RTTI data is *not* exported by MSVC though, so our initial implementation has already gotten the linkage wrong. This line from our IR is incorrect: @"\01??_R3VFoo@@8" = available_externally constant %MSRTTIClassHierarchyDescriptor ... _R3VFoo is not actually available externally. I think it would be correct to say it is linkonce_odr, so that if we discard the vtable, which is available externally, we can discard the RTTI data.
This has not been fixed yet, right? I just hit it again on a fresh clang build as of this morning.
No, it has not. I've prioritized this, should take a look soon.
Thsnks!
Fixed in r212256.