This revision was automatically updated to reflect the committed changes. Closed by commit rL244488: [dllimport] A non-imported class with an imported key can't have a key (authored by rnk).
Changed prior to commit: http://reviews.llvm.org/D11913?vs=31697&id=31710#toc Repository: rL LLVM http://reviews.llvm.org/D11913 Files: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp 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 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<DLLImportAttr>() && !RD->hasAttr<DLLImportAttr>()) + 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 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<DLLImportAttr>() && !RD->hasAttr<DLLImportAttr>()) + return nullptr; + // We found it. return MD; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits