[clang] [Clang][Sema] Expose static inline functions from GMF (PR #104701)
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 19 18:51:11 PDT 2024
Jan =?utf-8?q?Kokemüller?= <jan.kokemueller at gmail.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/104701 at 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
More information about the cfe-commits
mailing list