[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() &&
----------------
ChuanqiXu9 wrote:

```suggestion
        Function->isFromGlobalModule() 
```

https://github.com/llvm/llvm-project/pull/104701


More information about the cfe-commits mailing list