Jan =?utf-8?q?Kokemüller?= <jan.kokemuel...@gmail.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/104...@github.com>
================ @@ -6926,11 +6926,26 @@ void Sema::AddOverloadCandidate( /// have linkage. So that all entities of the same should share one /// linkage. But in clang, different entities of the same could have /// different linkage. - NamedDecl *ND = Function; - if (auto *SpecInfo = Function->getTemplateSpecializationInfo()) + const NamedDecl *ND = Function; + bool IsImplicitlyInstantiated = false; + if (auto *SpecInfo = Function->getTemplateSpecializationInfo()) { ND = SpecInfo->getTemplate(); - - if (ND->getFormalLinkage() == Linkage::Internal) { + IsImplicitlyInstantiated = SpecInfo->getTemplateSpecializationKind() == + TSK_ImplicitInstantiation; + } + + /// Don't remove inline functions with internal linkage from the overload + /// set if they are declared in a GMF. + /// The global module is meant to be a transition mechanism for C and C++ + /// headers. + /// Inline functions with internal linkage are a common pattern in headers + /// to avoid ODR issues. + const bool IsInlineFunctionInGMF = + Function->getOwningModule() && + Function->getOwningModule()->isGlobalModule() && + (IsImplicitlyInstantiated || Function->isInlined()); ---------------- ChuanqiXu9 wrote: Maybe we can replace `(IsImplicitlyInstantiated || Function->isInlined())` with `getASTContext().GetGVALinkageForFunction(Function) == GVA_DiscardableODR`. https://github.com/llvm/llvm-project/pull/104701 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits