File llvm21-CompilerInstance-and-PointerUnion.patch of Package ccls

From 44fb405d00dead04de43891c9818d798f10fc41e Mon Sep 17 00:00:00 2001
From: Fangrui Song <i@maskray.me>
Date: Sun, 11 May 2025 23:01:55 -0700
Subject: [PATCH] Adapt llvmorg-21 changes: clang::CompilerInstance and
 llvm::PointerUnion

---
 src/indexer.cc      | 22 ++++++++++++++++++++++
 src/sema_manager.cc |  8 ++++++++
 2 files changed, 30 insertions(+)

diff --git a/src/indexer.cc b/src/indexer.cc
index 17d8cc2d8..770712267 100644
--- a/src/indexer.cc
+++ b/src/indexer.cc
@@ -377,10 +377,17 @@ const Decl *getAdjustedDecl(const Decl *d) {
         if (!s->isExplicitSpecialization()) {
           llvm::PointerUnion<ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl *> result =
               s->getSpecializedTemplateOrPartial();
+#if LLVM_VERSION_MAJOR >= 15 // llvmorg-15-init-10510-gaab5bd180a42
+          if (auto *ctd = dyn_cast<ClassTemplateDecl *>(result))
+            d = ctd;
+          else
+            d = cast<ClassTemplatePartialSpecializationDecl *>(result);
+#else
           if (result.is<ClassTemplateDecl *>())
             d = result.get<ClassTemplateDecl *>();
           else
             d = result.get<ClassTemplatePartialSpecializationDecl *>();
+#endif
           continue;
         }
       } else if (auto *d1 = r->getInstantiatedFromMemberClass()) {
@@ -964,10 +971,17 @@ class IndexDataConsumer : public index::IndexDataConsumer {
           else if (auto *sd = dyn_cast<ClassTemplateSpecializationDecl>(rd)) {
             llvm::PointerUnion<ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl *> result =
                 sd->getSpecializedTemplateOrPartial();
+#if LLVM_VERSION_MAJOR >= 15 // llvmorg-15-init-10510-gaab5bd180a42
+            if (auto *ctd = dyn_cast<ClassTemplateDecl *>(result))
+              d1 = ctd;
+            else
+              d1 = cast<ClassTemplatePartialSpecializationDecl *>(result);
+#else
             if (result.is<ClassTemplateDecl *>())
               d1 = result.get<ClassTemplateDecl *>();
             else
               d1 = result.get<ClassTemplatePartialSpecializationDecl *>();
+#endif
 
           } else
             d1 = rd->getInstantiatedFromMemberClass();
@@ -1241,15 +1255,23 @@ IndexResult index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs, const st
     }
 
   IndexDiags dc;
+#if LLVM_VERSION_MAJOR >= 21
+  auto clang = std::make_unique<CompilerInstance>(std::move(ci), pch);
+#else
   auto clang = std::make_unique<CompilerInstance>(pch);
   clang->setInvocation(std::move(ci));
+#endif
   clang->createDiagnostics(
 #if LLVM_VERSION_MAJOR >= 20
       *fs,
 #endif
       &dc, false);
   clang->getDiagnostics().setIgnoreAllWarnings(true);
+#if LLVM_VERSION_MAJOR >= 21
+  clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getTargetOpts()));
+#else
   clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getInvocation().TargetOpts));
+#endif
   if (!clang->hasTarget())
     return {};
   clang->getPreprocessorOpts().RetainRemappedFileBuffers = true;
diff --git a/src/sema_manager.cc b/src/sema_manager.cc
index b6b3df971..325c9a9c4 100644
--- a/src/sema_manager.cc
+++ b/src/sema_manager.cc
@@ -261,14 +261,22 @@ std::unique_ptr<CompilerInstance> buildCompilerInstance(Session &session, std::u
   else
     ci->getPreprocessorOpts().addRemappedFile(main, buf.get());
 
+#if LLVM_VERSION_MAJOR >= 21
+  auto clang = std::make_unique<CompilerInstance>(std::move(ci), session.pch);
+#else
   auto clang = std::make_unique<CompilerInstance>(session.pch);
   clang->setInvocation(std::move(ci));
+#endif
   clang->createDiagnostics(
 #if LLVM_VERSION_MAJOR >= 20
       *fs,
 #endif
       &dc, false);
+#if LLVM_VERSION_MAJOR >= 21
+  clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getTargetOpts()));
+#else
   clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getInvocation().TargetOpts));
+#endif
   if (!clang->hasTarget())
     return nullptr;
   clang->getPreprocessorOpts().RetainRemappedFileBuffers = true;
openSUSE Build Service is sponsored by