diff -Nur creduce/clang_delta/CommonRenameClassRewriteVisitor.h creduce-orig/clang_delta/CommonRenameClassRewriteVisitor.h
--- creduce/clang_delta/CommonRenameClassRewriteVisitor.h	2025-11-23 17:06:45.944165100 +0100
+++ creduce-orig/clang_delta/CommonRenameClassRewriteVisitor.h	2025-11-23 17:00:44.931567400 +0100
@@ -310,7 +310,12 @@
     dyn_cast<DependentTemplateSpecializationType>(Ty);
   TransAssert(DTST && "Bad DependentTemplateSpecializationType!");
 
-  const IdentifierInfo *IdInfo = DTST->getIdentifier();
+  const IdentifierInfo *IdInfo =
+#if LLVM_VERSION_MAJOR > 20
+    DTST->getDependentTemplateName().getName().getIdentifier();
+#else
+    DTST->getIdentifier();
+#endif
   std::string IdName = IdInfo->getName().str();
   std::string Name;
   if (getNewNameByName(IdName, Name)) {
diff -Nur creduce/clang_delta/RemoveNamespace.cpp creduce-orig/clang_delta/RemoveNamespace.cpp
--- creduce/clang_delta/RemoveNamespace.cpp	2025-11-23 17:06:46.529827700 +0100
+++ creduce-orig/clang_delta/RemoveNamespace.cpp	2025-11-23 17:02:04.695912400 +0100
@@ -440,7 +440,12 @@
     dyn_cast<DependentTemplateSpecializationType>(Ty);
   TransAssert(DTST && "Bad DependentTemplateSpecializationType!");
 
-  const IdentifierInfo *IdInfo = DTST->getIdentifier();
+  const IdentifierInfo *IdInfo =
+#if LLVM_VERSION_MAJOR > 20
+    DTST->getDependentTemplateName().getName().getIdentifier();
+#else
+    DTST->getIdentifier();
+#endif
   std::string IdName = IdInfo->getName().str();
   std::string Name;
 
@@ -563,7 +568,9 @@
         break;
       }
       case NestedNameSpecifier::TypeSpec: // Fall-through
+#if LLVM_VERSION_MAJOR <= 20
       case NestedNameSpecifier::TypeSpecWithTemplate:
+#endif
         TraverseTypeLoc(Loc.getTypeLoc());
         break;
       default:
diff -Nur creduce/clang_delta/RemoveUnusedFunction.cpp creduce-orig/clang_delta/RemoveUnusedFunction.cpp
--- creduce/clang_delta/RemoveUnusedFunction.cpp	2025-11-23 17:06:45.975874900 +0100
+++ creduce-orig/clang_delta/RemoveUnusedFunction.cpp	2025-11-23 17:02:39.264543600 +0100
@@ -254,7 +254,11 @@
 
   if (FD->isReferenced() ||
       FD->isMain() ||
+#if LLVM_VERSION_MAJOR > 20
+      FD->hasAttr<DeviceKernelAttr>() ||
+#else
       FD->hasAttr<OpenCLKernelAttr>() ||
+#endif
       ConsumerInstance->hasReferencedSpecialization(CanonicalFD) ||
       ConsumerInstance->isInlinedSystemFunction(CanonicalFD) ||
       ConsumerInstance->isInReferencedSet(CanonicalFD) ||
diff -Nur creduce/clang_delta/RenameFun.cpp creduce-orig/clang_delta/RenameFun.cpp
--- creduce/clang_delta/RenameFun.cpp	2025-11-23 17:06:45.975874900 +0100
+++ creduce-orig/clang_delta/RenameFun.cpp	2025-11-23 17:03:36.259131600 +0100
@@ -261,7 +261,11 @@
 {
   std::string Name = FD->getNameAsString();
   // Skip special functions
+#if LLVM_VERSION_MAJOR > 20
+  if (isSpecialFun(Name) || FD->hasAttr<DeviceKernelAttr>())
+#else
   if (isSpecialFun(Name) || FD->hasAttr<OpenCLKernelAttr>())
+#endif
     FunToNameMap[FD] = Name;
 
   if (FunToNameMap.find(FD) != FunToNameMap.end())
diff -Nur creduce/clang_delta/Transformation.cpp creduce-orig/clang_delta/Transformation.cpp
--- creduce/clang_delta/Transformation.cpp	2025-11-23 17:06:46.545483200 +0100
+++ creduce-orig/clang_delta/Transformation.cpp	2025-11-23 17:01:46.110619000 +0100
@@ -638,7 +638,10 @@
         return NAD->getNamespace()->getCanonicalDecl();
       }
       case NestedNameSpecifier::TypeSpec: // Fall-through
-      case NestedNameSpecifier::TypeSpecWithTemplate: {
+#if LLVM_VERSION_MAJOR <= 20
+      case NestedNameSpecifier::TypeSpecWithTemplate:
+#endif
+      {
         const Type *Ty = NNS->getAsType();
         if (const RecordType *RT = Ty->getAs<RecordType>())
           return RT->getDecl();
diff -Nur creduce/clang_delta/TransformationManager.cpp creduce-orig/clang_delta/TransformationManager.cpp
--- creduce/clang_delta/TransformationManager.cpp	2025-11-23 17:06:46.545483200 +0100
+++ creduce-orig/clang_delta/TransformationManager.cpp	2025-11-23 17:06:02.474050300 +0100
@@ -125,7 +125,12 @@
     ClangInstance->createFileManager();
 
     if(CLCPath != NULL && ClangInstance->hasFileManager() &&
-       ClangInstance->getFileManager().getDirectory(CLCPath, false)) {
+#if LLVM_VERSION_MAJOR > 20
+       ClangInstance->getFileManager().getDirectoryRef(CLCPath, false)
+#else
+       ClangInstance->getFileManager().getDirectory(CLCPath, false)
+#endif
+    ) {
         Args.push_back("-I");
         Args.push_back(CLCPath);
     }
@@ -147,7 +152,12 @@
 
   TargetInfo *Target = 
     TargetInfo::CreateTargetInfo(ClangInstance->getDiagnostics(),
-                                 ClangInstance->getInvocation().TargetOpts);
+#if LLVM_VERSION_MAJOR > 20
+                                 ClangInstance->getInvocation().getTargetOpts()
+#else
+                                 ClangInstance->getInvocation().TargetOpts
+#endif
+                                 );
   ClangInstance->setTarget(Target);
 
   if (const char *env = getenv("CREDUCE_INCLUDE_PATH")) {
