diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-12-08 03:56:49 +0000 | 
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-12-08 03:56:49 +0000 | 
| commit | f2c79b6b9ca75424ceeb246c91916728ee3a26fd (patch) | |
| tree | d025836729e4c763dcdef2388ab1369242309773 /clang/lib | |
| parent | 4569f69558efad0ad6dbc68a58f1b4955b67caae (diff) | |
| download | bcm5719-llvm-f2c79b6b9ca75424ceeb246c91916728ee3a26fd.tar.gz bcm5719-llvm-f2c79b6b9ca75424ceeb246c91916728ee3a26fd.zip  | |
Misc key function fixes.
llvm-svn: 90831
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 11 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 10 | 
2 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index f7da8903504..c914f3f82e8 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -724,7 +724,13 @@ ASTRecordLayoutBuilder::ComputeKeyFunction(const CXXRecordDecl *RD) {    // function.    if (RD->getTemplateSpecializationKind() != TSK_Undeclared)      return 0; -   + +  // A class inside an anonymous namespace doesn't have a key function.  (Or +  // at least, there's no point to assigning a key function to such a class; +  // this doesn't affect the ABI.) +  if (RD->isInAnonymousNamespace()) +    return 0; +    for (CXXRecordDecl::method_iterator I = RD->method_begin(),          E = RD->method_end(); I != E; ++I) {      const CXXMethodDecl *MD = *I; @@ -734,6 +740,9 @@ ASTRecordLayoutBuilder::ComputeKeyFunction(const CXXRecordDecl *RD) {      if (MD->isPure())        continue; + +    if (MD->isInlineSpecified()) +      continue;      // Ignore implicit member functions, they are always marked as inline, but      // they don't have a body until they're defined. diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6250e6952d3..a063e21307c 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -522,6 +522,16 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {          FD->hasAttr<DestructorAttr>())        return false; +    // The key function for a class must never be deferred. +    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Global)) { +      const CXXRecordDecl *RD = MD->getParent(); +      if (MD->isOutOfLine() && RD->isDynamicClass()) { +        const CXXMethodDecl *KeyFunction = getContext().getKeyFunction(RD); +        if (KeyFunction == MD->getCanonicalDecl()) +          return false; +      } +    } +      GVALinkage Linkage = GetLinkageForFunction(getContext(), FD, Features);      // static, static inline, always_inline, and extern inline functions can  | 

