From: Reid Kleckner Date: Mon, 10 Aug 2015 19:39:01 +0000 (+0000) Subject: [dllimport] A non-imported class with an imported key can't have a key X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b7293787290dedf30ef5c1d1224bb695ce3dc507;p=clang [dllimport] A non-imported class with an imported key can't have a key Summary: The vtable takes its DLL storage class from the class, not the key function. When they disagree, the vtable won't be exported by the DLL that defines the key function. The easiest way to ensure that importers of the class emit their own vtable is to say that the class has no key function. Reviewers: hans, majnemer Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D11913 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244488 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index ec6dac34c5..d3aeb3e41a 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -2008,6 +2008,12 @@ static const CXXMethodDecl *computeKeyFunction(ASTContext &Context, 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; } diff --git a/test/CodeGenCXX/dllimport-rtti.cpp b/test/CodeGenCXX/dllimport-rtti.cpp index 609ad1637c..071ce278a5 100644 --- a/test/CodeGenCXX/dllimport-rtti.cpp +++ b/test/CodeGenCXX/dllimport-rtti.cpp @@ -22,3 +22,11 @@ struct __declspec(dllimport) V { // 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