mirror of
https://github.com/intel/llvm.git
synced 2026-01-31 07:27:33 +08:00
Do not give implicitly-defined virtual members functions
available_externally linkage, since they may not have been given a
strong definition in another translation unit. Without this patch, the
following test case fails to link with a GCC-compiled libstdc++:
#include <sstream>
int main() { std::basic_stringbuf<char> bs; }
Fixes the last problem with the Boost.IO library.
llvm-svn: 103208
This commit is contained in:
@@ -322,8 +322,8 @@ GetLinkageForFunction(ASTContext &Context, const FunctionDecl *FD,
|
||||
// only for inlining and analysis. This is the semantics of c99 inline.
|
||||
if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
|
||||
const CXXRecordDecl *RD = MD->getParent();
|
||||
if (MD->isVirtual() &&
|
||||
CodeGenVTables::isKeyFunctionInAnotherTU(Context, RD))
|
||||
if (MD->isVirtual() && !MD->isImplicit() &&
|
||||
CodeGenVTables::isKeyFunctionInAnotherTU(Context, RD))
|
||||
return CodeGenModule::GVA_C99Inline;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,3 +22,23 @@ template void f<int>(int);
|
||||
template <typename T> inline void g(T) { }
|
||||
template void g<int>(int);
|
||||
|
||||
template<typename T>
|
||||
struct X0 {
|
||||
virtual ~X0() { }
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct X1 : X0<T> {
|
||||
virtual void blarg();
|
||||
};
|
||||
|
||||
template<typename T> void X1<T>::blarg() { }
|
||||
|
||||
extern template struct X0<char>;
|
||||
extern template struct X1<char>;
|
||||
|
||||
// CHECK: define linkonce_odr void @_ZN2X1IcED1Ev(
|
||||
void test_X1() {
|
||||
X1<char> i1c;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user