Index: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp =================================================================== --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp @@ -2008,6 +2008,12 @@ continue; } + // If the key function is dllimport but the class isn't, then the class has + // no key function. The DLL that exports the key function won't export the + // vtable in this case. + if (MD->hasAttr() && !RD->hasAttr()) + return nullptr; + // We found it. return MD; } Index: cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp +++ cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp @@ -22,3 +22,11 @@ // GNU-DAG: @_ZTV1V = available_externally dllimport // GNU-DAG: @_ZTS1V = linkonce_odr // GNU-DAG: @_ZTI1V = linkonce_odr + +struct W { + __declspec(dllimport) virtual void f(); + virtual void g(); +} w; +// GNU-DAG: @_ZTV1W = linkonce_odr +// GNU-DAG: @_ZTS1W = linkonce_odr +// GNU-DAG: @_ZTI1W = linkonce_odr