diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-10-14 21:29:40 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-10-14 21:29:40 +0000 |
commit | 1028c9f0afc1cc5f4951b39b7067fa57c1fea07b (patch) | |
tree | 67145dd0903f4a08427f127d015b5f7ebdceaf1e /lib/AST/Decl.cpp | |
parent | 663b5a0be7261c29bc4c526a71cffcfa02d4153e (diff) |
Give explicit and implicit instantiations of static data members of
class templates the proper linkage.
Daniel, please look over the CodeGenModule bits.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84140 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index a908299bfe..da7959b16f 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -373,7 +373,23 @@ SourceRange VarDecl::getSourceRange() const { return SourceRange(getLocation(), getLocation()); } -VarDecl *VarDecl::getInstantiatedFromStaticDataMember() { +bool VarDecl::isOutOfLine() const { + if (!isStaticDataMember()) + return false; + + if (Decl::isOutOfLine()) + return true; + + // If this static data member was instantiated from a static data member of + // a class template, check whether that static data member was defined + // out-of-line. + if (VarDecl *VD = getInstantiatedFromStaticDataMember()) + return VD->isOutOfLine(); + + return false; +} + +VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const { if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo()) return cast<VarDecl>(MSI->getInstantiatedFrom()); @@ -388,7 +404,7 @@ TemplateSpecializationKind VarDecl::getTemplateSpecializationKind() const { return TSK_Undeclared; } -MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() { +MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() const { return getASTContext().getInstantiatedFromStaticDataMember(this); } @@ -809,7 +825,6 @@ FunctionDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { } bool FunctionDecl::isOutOfLine() const { - // FIXME: Should we restrict this to member functions? if (Decl::isOutOfLine()) return true; |