diff --git a/lib/CodeGen/ModuleBuilder.cpp b/lib/CodeGen/ModuleBuilder.cpp index 8aa9bfb421..511cf75d6a 100644 --- a/lib/CodeGen/ModuleBuilder.cpp +++ b/lib/CodeGen/ModuleBuilder.cpp @@ -64,7 +64,7 @@ namespace { std::unique_ptr Builder; private: - SmallVector DeferredInlineMethodDefinitions; + SmallVector DeferredInlineMemberFuncDefs; public: CodeGeneratorImpl(DiagnosticsEngine &diags, llvm::StringRef ModuleName, @@ -80,7 +80,7 @@ namespace { ~CodeGeneratorImpl() override { // There should normally not be any leftover inline method definitions. - assert(DeferredInlineMethodDefinitions.empty() || + assert(DeferredInlineMemberFuncDefs.empty() || Diags.hasErrorOccurred()); } @@ -163,16 +163,16 @@ namespace { } void EmitDeferredDecls() { - if (DeferredInlineMethodDefinitions.empty()) + if (DeferredInlineMemberFuncDefs.empty()) return; // Emit any deferred inline method definitions. Note that more deferred // methods may be added during this loop, since ASTConsumer callbacks // can be invoked if AST inspection results in declarations being added. HandlingTopLevelDeclRAII HandlingDecl(*this); - for (unsigned I = 0; I != DeferredInlineMethodDefinitions.size(); ++I) - Builder->EmitTopLevelDecl(DeferredInlineMethodDefinitions[I]); - DeferredInlineMethodDefinitions.clear(); + for (unsigned I = 0; I != DeferredInlineMemberFuncDefs.size(); ++I) + Builder->EmitTopLevelDecl(DeferredInlineMemberFuncDefs[I]); + DeferredInlineMemberFuncDefs.clear(); } void HandleInlineFunctionDefinition(FunctionDecl *D) override { @@ -181,17 +181,6 @@ namespace { assert(D->doesThisDeclarationHaveABody()); - // Handle friend functions. - if (D->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend)) { - if (Ctx->getTargetInfo().getCXXABI().isMicrosoft() - && !D->getLexicalDeclContext()->isDependentContext()) - Builder->EmitTopLevelDecl(D); - return; - } - - // Otherwise, must be a method. - auto MD = cast(D); - // We may want to emit this definition. However, that decision might be // based on computing the linkage, and we have to defer that in case we // are inside of something that will change the method's final linkage, @@ -200,13 +189,13 @@ namespace { // void bar(); // void foo() { bar(); } // } A; - DeferredInlineMethodDefinitions.push_back(MD); + DeferredInlineMemberFuncDefs.push_back(D); // Provide some coverage mapping even for methods that aren't emitted. // Don't do this for templated classes though, as they may not be // instantiable. - if (!MD->getParent()->isDependentContext()) - Builder->AddDeferredUnusedCoverageMapping(MD); + if (!D->getLexicalDeclContext()->isDependentContext()) + Builder->AddDeferredUnusedCoverageMapping(D); } /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl