From: Reid Kleckner Date: Tue, 18 Aug 2015 23:18:57 +0000 (+0000) Subject: Merge r244488 to the 3.7 release branch X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7e3411cfc41df40eabcbe9fcefff08822027da0a;p=clang Merge r244488 to the 3.7 release branch It avoids doing key function optimizations when the key function is dllimported. Fixed PR24409. git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_37@245388 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 388c91c9cb..de7bcb826e 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -2014,6 +2014,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 f2d1bec95c..6fe67daa38 100644 --- a/test/CodeGenCXX/dllimport-rtti.cpp +++ b/test/CodeGenCXX/dllimport-rtti.cpp @@ -20,3 +20,11 @@ struct __declspec(dllimport) V { virtual void f(); } v; // GNU-DAG: @_ZTV1V = external dllimport + +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