]> granicus.if.org Git - clang/commitdiff
static methods don't get this pointers.
authorChris Lattner <sabre@nondot.org>
Tue, 12 May 2009 20:21:39 +0000 (20:21 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 12 May 2009 20:21:39 +0000 (20:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71583 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp

index 08f2b27bea52cef316a8aa17a9f71b5afb786296..a6191c5bb37ef1af19a88e26aab9e37dd825f573 100644 (file)
@@ -245,7 +245,7 @@ GetLinkageForFunction(const FunctionDecl *FD, const LangOptions &Features) {
   if (FD->getStorageClass() == FunctionDecl::Static)
     return CodeGenModule::GVA_Internal;
 
-  if (!FD->isInline())
+  if (!FD->isInline() && !isa<CXXMethodDecl>(FD))
     return CodeGenModule::GVA_StrongExternal;
   
   // If the inline function explicitly has the GNU inline attribute on it, or if
@@ -600,12 +600,20 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(const char *MangledName,
   // deferred decl with this name, remember that we need to emit it at the end
   // of the file.
   llvm::DenseMap<const char*, GlobalDecl>::iterator DDI = 
-  DeferredDecls.find(MangledName);
+    DeferredDecls.find(MangledName);
   if (DDI != DeferredDecls.end()) {
     // Move the potentially referenced deferred decl to the DeferredDeclsToEmit
     // list, and remove it from DeferredDecls (since we don't need it anymore).
     DeferredDeclsToEmit.push_back(DDI->second);
     DeferredDecls.erase(DDI);
+  } else
+    if (MayDeferGeneration(D)) {
+    // If this the first reference to a C++ inline function in a class, queue up
+    // the deferred function body for emission.  These are not seen as
+    // top-level declarations.
+    if (!isa<CXXConstructorDecl>(D) &&
+        !isa<CXXDestructorDecl>(D))
+    DeferredDeclsToEmit.push_back(GlobalDecl(D));
   }
   
   // This function doesn't have a complete type (for example, the return