public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Artur Frenszek-Iwicki <fedora@svgames.pl>
To: git-commits@fedoraproject.org
Subject: [rpms/cvise] rawhide: Update to v2.12.0, fix FTBFS
Date: Wed, 05 Aug 2026 19:28:15 GMT [thread overview]
Message-ID: <178595809533.1.10373673727319849883.rpms-cvise-ab282320661c@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/cvise
Branch : rawhide
Commit : ab282320661cff1a0f29f9667ff239550257e359
Author : Artur Frenszek-Iwicki <fedora@svgames.pl>
Date : 2026-07-17T15:42:09+02:00
Stats : +1567/-4 in 4 file(s)
URL : https://src.fedoraproject.org/rpms/cvise/c/ab282320661cff1a0f29f9667ff239550257e359?branch=rawhide
Log:
Update to v2.12.0, fix FTBFS
---
diff --git a/.gitignore b/.gitignore
index a620747..8890219 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@
/v2.10.0.tar.gz
/v2.10.0.1.tar.gz
/v2.11.0.tar.gz
+/v2.12.0.tar.gz
diff --git a/cvise.spec b/cvise.spec
index 9015554..b3d4ec8 100644
--- a/cvise.spec
+++ b/cvise.spec
@@ -1,12 +1,22 @@
Name: cvise
-Version: 2.11.0
-Release: 6%{?dist}
+Version: 2.12.0
+Release: 1%{?dist}
Summary: Super-parallel Python port of the C-Reduce
# Automatically converted from old format: BSD - review is highly recommended.
License: LicenseRef-Callaway-BSD
URL: https://github.com/marxin/cvise
Source: https://github.com/marxin/cvise/archive/v%{version}.tar.gz
+# Fix compatibility with LLVM22.
+#
+# Backport of upstream commits:
+# https://github.com/marxin/cvise/commit/59e9058c43b12b802893bde668113c8b3b3525b7
+# https://github.com/marxin/cvise/commit/68262f7d6de584b6474801827cb7dfc68011de25
+# https://github.com/marxin/cvise/commit/fa1be9523d569adfe207c85a1e44f074172bc305
+# https://github.com/marxin/cvise/commit/b17bbacdb279babd87dc9ef24756f3003746717c
+# https://github.com/marxin/cvise/commit/c7f9642340eb61c09a05c96498fd21c9b7293770
+Patch1: llvm22.patch
+
BuildRequires: astyle
BuildRequires: cmake
BuildRequires: flex
@@ -43,7 +53,7 @@ has the same property. It is intended for use by people who discover
and report bugs in compilers and other tools that process C/C++ or OpenCL code.
%prep
-%setup -q
+%autosetup -p1
%build
export CXXFLAGS="$RPM_OPT_FLAGS -Wno-error=restrict"
@@ -68,6 +78,9 @@ export CXXFLAGS="$RPM_OPT_FLAGS -Wno-error=restrict"
%{_datadir}/cvise
%changelog
+* Fri Jul 17 2026 Artur Frenszek-Iwicki <fedora@svgames.pl> - 2.12.0-1
+- Update to v2.12.0 (rhbz#2123703), fix FTBFS (rhbz#2433972)
+
* Wed Jul 15 2026 Fedora Release Engineering <releng@fedoraproject.org> - 2.11.0-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
diff --git a/llvm22.patch b/llvm22.patch
new file mode 100644
index 0000000..cd520dd
--- /dev/null
+++ b/llvm22.patch
@@ -0,0 +1,1549 @@
+diff -rNU4 cvise-2.12.0--orig/clang_delta/CMakeLists.txt cvise-2.12.0/clang_delta/CMakeLists.txt
+--- cvise-2.12.0--orig/clang_delta/CMakeLists.txt 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/CMakeLists.txt 2026-07-17 15:05:38.202425418 +0200
+@@ -348,8 +348,10 @@
+ "/tests/rename-param/invalid.output"
+ "/tests/rename-param/stuck.ii"
+ "/tests/rename-var/rename-var.c"
+ "/tests/rename-var/rename-var.output"
++ "/tests/replace-dependent-typedef/test2.cc"
++ "/tests/replace-dependent-typedef/test2.output"
+ "/tests/replace-derived-class/replace-derived1.cpp"
+ "/tests/replace-derived-class/replace-derived1.output"
+ "/tests/replace-derived-class/replace-derived2.cpp"
+ "/tests/replace-derived-class/replace-derived2.output"
+diff -rNU4 cvise-2.12.0--orig/clang_delta/CommonParameterRewriteVisitor.h cvise-2.12.0/clang_delta/CommonParameterRewriteVisitor.h
+--- cvise-2.12.0--orig/clang_delta/CommonParameterRewriteVisitor.h 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/CommonParameterRewriteVisitor.h 2026-07-17 13:53:45.285780097 +0200
+@@ -110,11 +110,17 @@
+ TransAssert(((DName.getNameKind() == clang::DeclarationName::Identifier) ||
+ (DName.getNameKind() ==
+ clang::DeclarationName::CXXOperatorName)) &&
+ "Not an indentifier!");
++#if LLVM_VERSION_MAJOR < 22
+ if (const clang::NestedNameSpecifier *NNS = UE->getQualifier()) {
+ if (const clang::DeclContext *Ctx =
+ ConsumerInstance->getDeclContextFromSpecifier(NNS)) {
++#else
++ if (const clang::NestedNameSpecifier NNS = UE->getQualifier()) {
++ if (const clang::DeclContext *Ctx =
++ ConsumerInstance->getDeclContextFromSpecifier(&NNS)) {
++#endif
+ DeclContextSet VisitedCtxs;
+ CalleeDecl =
+ ConsumerInstance->lookupFunctionDecl(DName, Ctx, VisitedCtxs);
+ }
+diff -rNU4 cvise-2.12.0--orig/clang_delta/CommonRenameClassRewriteVisitor.h cvise-2.12.0/clang_delta/CommonRenameClassRewriteVisitor.h
+--- cvise-2.12.0--orig/clang_delta/CommonRenameClassRewriteVisitor.h 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/CommonRenameClassRewriteVisitor.h 2026-07-17 14:14:42.079575996 +0200
+@@ -53,10 +53,13 @@
+ TemplateSpecializationTypeLoc TSPLoc);
+
+ bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc);
+
++#if LLVM_VERSION_MAJOR < 22
+ bool VisitDependentTemplateSpecializationTypeLoc(
+ DependentTemplateSpecializationTypeLoc DTSLoc);
++#endif
++
+ #if LLVM_VERSION_MAJOR < 19
+ bool VisitClassTemplatePartialSpecializationDecl(
+ ClassTemplatePartialSpecializationDecl *D);
+ #endif
+@@ -295,8 +298,9 @@
+ bool CommonRenameClassRewriteVisitor<T>::VisitInjectedClassNameTypeLoc(
+ InjectedClassNameTypeLoc TyLoc)
+ {
+ const CXXRecordDecl *CXXRD = TyLoc.getDecl();
++
+ TransAssert(CXXRD && "Invalid CXXRecordDecl!");
+
+ std::string Name;
+ if (getNewName(CXXRD, Name)) {
+@@ -336,8 +340,9 @@
+ if (Ty->isUnionType())
+ return true;
+
+ const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RTLoc.getDecl());
++
+ if (!RD)
+ return true;
+
+ std::string Name;
+@@ -358,8 +363,9 @@
+ RewriteHelper->replaceRecordType(RTLoc, Name);
+ return true;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ template<typename T> bool CommonRenameClassRewriteVisitor<T>::
+ VisitDependentTemplateSpecializationTypeLoc(
+ DependentTemplateSpecializationTypeLoc DTSLoc)
+ {
+@@ -367,9 +373,14 @@
+ const DependentTemplateSpecializationType *DTST =
+ 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)) {
+ SourceLocation LocStart = DTSLoc.getTemplateNameLoc();
+@@ -377,15 +388,28 @@
+ }
+
+ return true;
+ }
++#endif
+
+ template<typename T>
+ void CommonRenameClassRewriteVisitor<T>::renameTemplateName(
+ TemplateName TmplName, SourceLocation LocStart)
+ {
++#if LLVM_VERSION_MAJOR < 22
+ if (TmplName.getKind() == TemplateName::DependentTemplate)
+ return;
++#else
++ if (TmplName.getKind() == TemplateName::DependentTemplate) {
++ DependentTemplateName* DTN = TmplName.getAsDependentTemplateName();
++ const IdentifierInfo *IdInfo = DTN->getName().getIdentifier();
++ std::string IdName = IdInfo->getName().str();
++ std::string Name;
++ if (getNewNameByName(IdName, Name))
++ TheRewriter->ReplaceText(LocStart, IdName.size(), Name);
++ return;
++ }
++#endif
+ const TemplateDecl *TmplD = TmplName.getAsTemplateDecl();
+ TransAssert(TmplD && "Invalid TemplateDecl!");
+ NamedDecl *ND = TmplD->getTemplatedDecl();
+ // in some cases, ND could be NULL, e.g., the
+diff -rNU4 cvise-2.12.0--orig/clang_delta/EmptyStructToInt.cpp cvise-2.12.0/clang_delta/EmptyStructToInt.cpp
+--- cvise-2.12.0--orig/clang_delta/EmptyStructToInt.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/EmptyStructToInt.cpp 2026-07-17 14:00:33.565483599 +0200
+@@ -63,9 +63,11 @@
+ { }
+
+ bool VisitRecordTypeLoc(RecordTypeLoc RTLoc);
+
++#if LLVM_VERSION_MAJOR < 22
+ bool VisitElaboratedTypeLoc(ElaboratedTypeLoc Loc);
++#endif
+
+ bool VisitRecordDecl(RecordDecl *RD);
+
+ bool VisitVarDecl(VarDecl *VD);
+@@ -111,10 +113,38 @@
+ bool EmptyStructToIntRewriteVisitor::VisitRecordTypeLoc(RecordTypeLoc RTLoc)
+ {
+ const RecordDecl *RD = RTLoc.getDecl();
+
++
+ if (RD->getCanonicalDecl() == ConsumerInstance->TheRecordDecl) {
+ SourceLocation LocStart = RTLoc.getBeginLoc();
++#if LLVM_VERSION_MAJOR >= 22
++ // Check this ElaboratedTypeLoc hasn't been removed along with the RD
++ if (!ConsumerInstance->isSourceRangeWithinRecordDecl(
++ RTLoc.getSourceRange(), RD)) {
++ if (RTLoc.getBeginLoc() != RTLoc.getNonElaboratedBeginLoc()) {
++ SourceLocation KeywordEndLoc = RTLoc.getNonElaboratedBeginLoc().getLocWithOffset(-1);
++ ConsumerInstance->TheRewriter.RemoveText(SourceRange(RTLoc.getBeginLoc(), KeywordEndLoc));
++ } else {
++ // It's possible, e.g.,
++ // struct S1 {
++ // struct { } S;
++ // };
++ // Clang will translate struct { } S to
++ // struct {
++ // };
++ // struct <anonymous struct ...> S;
++ // the last declaration is injected by clang.
++ // We need to omit it.
++ SourceLocation KeywordLoc = RTLoc.getElaboratedKeywordLoc();
++ const llvm::StringRef Keyword =
++ TypeWithKeyword::getKeywordName(RTLoc.getTypePtr()->getKeyword());
++ ConsumerInstance->TheRewriter.ReplaceText(KeywordLoc,
++ Keyword.size(), "int");
++ }
++ }
++#endif
++
+ void *LocPtr = LocStart.getPtrEncoding();
+ if (ConsumerInstance->VisitedLocs.count(LocPtr))
+ return true;
+ ConsumerInstance->VisitedLocs.insert(LocPtr);
+@@ -136,8 +166,9 @@
+ }
+ return true;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ bool EmptyStructToIntRewriteVisitor::VisitElaboratedTypeLoc(
+ ElaboratedTypeLoc Loc)
+ {
+ const ElaboratedType *ETy = dyn_cast<ElaboratedType>(Loc.getTypePtr());
+@@ -159,8 +190,10 @@
+ SourceLocation EndLoc = TyLoc.getBeginLoc();
+ if (EndLoc.isInvalid())
+ return true;
+ EndLoc = EndLoc.getLocWithOffset(-1);
++ if (EndLoc.isInvalid())
++ return true;
+ // This ElaboratedTypeLoc has been removed along with the RD
+ if (ConsumerInstance->isSourceRangeWithinRecordDecl(
+ SourceRange(StartLoc, EndLoc), RD)) {
+ return true;
+@@ -192,8 +225,9 @@
+
+ ConsumerInstance->TheRewriter.RemoveText(SourceRange(StartLoc, EndLoc));
+ return true;
+ }
++#endif
+
+ bool EmptyStructToIntRewriteVisitor::VisitRecordDecl(RecordDecl *RD)
+ {
+ //if (ConsumerInstance->isSpecialRecordDecl(RD))
+@@ -395,8 +429,9 @@
+ const RecordType *RT = PointeeTy->getAs<RecordType>();
+ if (!RT)
+ return false;
+ const RecordDecl *RD = RT->getDecl();
++
+ const RecordDecl *Parent = FD->getParent();
+ return (Parent->getCanonicalDecl() == RD->getCanonicalDecl());
+ }
+
+@@ -486,8 +521,9 @@
+ return NULL;
+
+ const RecordType *RT = Ty->getAsStructureType();
+ return RT->getDecl()->getDefinition();
++
+ }
+
+ void EmptyStructToInt::getInitExprs(const Type *Ty,
+ const Expr *E,
+@@ -526,8 +562,9 @@
+ }
+
+ const RecordDecl *RD = RT->getDecl();
+
++
+ if (RD->getCanonicalDecl() == TheRecordDecl) {
+ InitExprs.push_back(E);
+ }
+ else {
+diff -rNU4 cvise-2.12.0--orig/clang_delta/InstantiateTemplateParam.cpp cvise-2.12.0/clang_delta/InstantiateTemplateParam.cpp
+--- cvise-2.12.0--orig/clang_delta/InstantiateTemplateParam.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/InstantiateTemplateParam.cpp 2026-07-17 14:00:33.565608845 +0200
+@@ -284,8 +284,9 @@
+ RecordDeclSet &TempAvailableRecordDecls)
+ {
+ if (const RecordType *RT = Ty->getAsUnionType()) {
+ const RecordDecl *RD = RT->getDecl();
++
+ addOneForwardDeclStr(RD, ForwardStr, TempAvailableRecordDecls);
+ return;
+ }
+
+diff -rNU4 cvise-2.12.0--orig/clang_delta/MemberToGlobal.cpp cvise-2.12.0/clang_delta/MemberToGlobal.cpp
+--- cvise-2.12.0--orig/clang_delta/MemberToGlobal.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/MemberToGlobal.cpp 2026-07-17 14:09:20.859030227 +0200
+@@ -28,9 +28,9 @@
+
+ static RegisterTransformation<MemberToGlobal>
+ Trans("member-to-global", DescriptionMsg);
+
+-class MemberToGlobal::CollectionVisitor : public
++class MemberToGlobal::CollectionVisitor : public
+ RecursiveASTVisitor<CollectionVisitor> {
+
+ public:
+ explicit CollectionVisitor(MemberToGlobal *Instance)
+@@ -65,8 +65,9 @@
+
+ return true;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ bool VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
+ // Replace CLASS::TYPE by TYPE
+ if (auto* TT = TL.getInnerType()->getAs<TypedefType>()) {
+ if (ConsumerInstance->isTheDecl(TT->getDecl())) {
+@@ -79,8 +80,21 @@
+ }
+
+ return true;
+ }
++#else
++ bool VisitTypedefTypeLoc(const TypedefTypeLoc &TTL) {
++ if (ConsumerInstance->isTheDecl(TTL.getDecl()))
++ ConsumerInstance->removeRecordQualifier(TTL.getQualifierLoc());
++ return true;
++ }
++
++ bool VisitTagTypeLoc(TagTypeLoc TL) {
++ if (ConsumerInstance->isTheDecl(TL.getDecl()))
++ ConsumerInstance->removeRecordQualifier(TL.getQualifierLoc());
++ return true;
++ }
++#endif
+
+ bool VisitDeclRefExpr(DeclRefExpr* DRE) {
+ if (ConsumerInstance->isTheDecl(DRE->getDecl())) {
+ ConsumerInstance->removeRecordQualifier(DRE->getQualifierLoc());
+@@ -92,9 +106,9 @@
+ private:
+ MemberToGlobal *ConsumerInstance;
+ };
+
+-void MemberToGlobal::Initialize(ASTContext &context)
++void MemberToGlobal::Initialize(ASTContext &context)
+ {
+ Transformation::Initialize(context);
+ }
+
+@@ -111,10 +125,19 @@
+ void MemberToGlobal::removeRecordQualifier(const NestedNameSpecifierLoc& NNSLoc) {
+ if (!NNSLoc)
+ return;
+
+- if (isTheRecordDecl(NNSLoc.getNestedNameSpecifier()->getAsRecordDecl())) {
++#if LLVM_VERSION_MAJOR < 22
++ CXXRecordDecl *RD = NNSLoc.getNestedNameSpecifier()->getAsRecordDecl();
++#else
++ CXXRecordDecl *RD = NNSLoc.getNestedNameSpecifier().getAsRecordDecl();
++#endif
++ if (isTheRecordDecl(RD)) {
+ SourceRange SR = NNSLoc.getLocalSourceRange();
++#if LLVM_VERSION_MAJOR >= 22
++ if (TypeLoc TL = NNSLoc.getAsTypeLoc())
++ SR.setBegin(TL.castAs<TagTypeLoc>().getNameLoc());
++#endif
+ SR.setEnd(SR.getEnd().getLocWithOffset(1));
+
+ TheRewriter.RemoveText(SR);
+ }
+diff -rNU4 cvise-2.12.0--orig/clang_delta/ReducePointerLevel.cpp cvise-2.12.0/clang_delta/ReducePointerLevel.cpp
+--- cvise-2.12.0--orig/clang_delta/ReducePointerLevel.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/ReducePointerLevel.cpp 2026-07-17 14:00:33.565837606 +0200
+@@ -259,15 +259,17 @@
+ if (!ArrayElemTy->isStructureType() && !ArrayElemTy->isUnionType())
+ return true;
+ if (const RecordType *RDTy = ArrayElemTy->getAs<RecordType>()) {
+ const RecordDecl *RD = RDTy->getDecl();
++
+ ConsumerInstance->rewriteArrayInit(RD, VD->getInit());
+ }
+ return true;
+ }
+
+ if (const RecordType *RDTy = VDTy->getAs<RecordType>()) {
+ const RecordDecl *RD = RDTy->getDecl();
++
+ ConsumerInstance->rewriteRecordInit(RD, VD->getInit());
+ }
+
+ return true;
+@@ -977,8 +979,9 @@
+ if (!RD)
+ return false;
+
+ const RecordDecl *NestedRD = RTy->getDecl();
++
+ return (RD->getCanonicalDecl() == NestedRD->getCanonicalDecl());
+ }
+
+ void ReducePointerLevel::rewriteRecordInit(const RecordDecl *RD,
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RemoveBaseClass.cpp cvise-2.12.0/clang_delta/RemoveBaseClass.cpp
+--- cvise-2.12.0--orig/clang_delta/RemoveBaseClass.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RemoveBaseClass.cpp 2026-07-17 14:00:33.565966068 +0200
+@@ -97,10 +97,10 @@
+ E = SubC->bases_end(); I != E; ++I) {
+ if (I->getType()->isDependentType())
+ continue;
+
+- const CXXRecordDecl *BaseDecl =
+- dyn_cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
++ const RecordType *RT = I->getType()->getAs<RecordType>();
++ const CXXRecordDecl *BaseDecl = dyn_cast<CXXRecordDecl>(RT->getDecl());
+ if (Base->getCanonicalDecl() == BaseDecl->getCanonicalDecl())
+ return true;
+ }
+ return false;
+@@ -199,9 +199,15 @@
+ }
+
+ bool RemoveBaseClass::isTheBaseClass(const CXXBaseSpecifier &Specifier)
+ {
++#if LLVM_VERSION_MAJOR < 22
+ const Type *Ty = TheBaseClass->getTypeForDecl();
++#else
++ const Type *Ty = TheBaseClass->getASTContext()
++ .getCanonicalTagType(TheBaseClass)
++ ->getTypePtr();
++#endif
+ return Context->hasSameType(Specifier.getType(),
+ Ty->getCanonicalTypeInternal());
+ }
+
+@@ -251,10 +257,18 @@
+
+ if ((*I)->isBaseInitializer()) {
+ const Type *Ty = (*I)->getBaseClass();
+ TransAssert(Ty && "Invalid Base Class Type!");
+- if (Context->hasSameType(Ty->getCanonicalTypeInternal(),
+- TheBaseClass->getTypeForDecl()->getCanonicalTypeInternal())) {
++#if LLVM_VERSION_MAJOR < 22
++ QualType CanonT =
++ TheBaseClass->getTypeForDecl()->getCanonicalTypeInternal();
++#else
++ QualType CanonT = TheBaseClass->getASTContext()
++ .getCanonicalTagType(TheBaseClass)
++ ->getTypePtr()
++ ->getCanonicalTypeInternal();
++#endif
++ if (Context->hasSameType(Ty->getCanonicalTypeInternal(), CanonT)) {
+ Init = (*I);
+ break;
+ }
+ }
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RemoveNamespace.cpp cvise-2.12.0/clang_delta/RemoveNamespace.cpp
+--- cvise-2.12.0--orig/clang_delta/RemoveNamespace.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RemoveNamespace.cpp 2026-07-17 14:14:42.080060829 +0200
+@@ -90,10 +90,12 @@
+
+ bool VisitTemplateSpecializationTypeLoc(
+ TemplateSpecializationTypeLoc TSPLoc);
+
++#if LLVM_VERSION_MAJOR < 22
+ bool VisitDependentTemplateSpecializationTypeLoc(
+ DependentTemplateSpecializationTypeLoc DTSLoc);
++#endif
+
+ bool VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TyLoc);
+
+ bool VisitTypedefTypeLoc(TypedefTypeLoc TyLoc);
+@@ -225,11 +227,21 @@
+
+ // check if this UsingDecl refers to the namespaced being removed
+ NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc();
+ TransAssert(QualifierLoc && "Bad QualifierLoc!");
++#if LLVM_VERSION_MAJOR < 22
+ NestedNameSpecifierLoc PrefixLoc = QualifierLoc.getPrefix();
++#else
++ NestedNameSpecifierLoc PrefixLoc =
++ QualifierLoc.getAsNamespaceAndPrefix().Prefix;
++#endif
+
++#if LLVM_VERSION_MAJOR < 22
+ const NestedNameSpecifier *NNS = D->getQualifier();
++#else
++ const NestedNameSpecifier NNSVal = QualifierLoc.getNestedNameSpecifier();
++ const NestedNameSpecifier *NNS = NNSVal ? &NNSVal : nullptr;
++#endif
+ TransAssert(NNS && "Bad NameSpecifier!");
+ if (ConsumerInstance->isTheNamespaceSpecifier(NNS) &&
+ (!PrefixLoc || ConsumerInstance->isGlobalNamespace(PrefixLoc))) {
+ ConsumerInstance->RewriteHelper->removeDecl(D);
+@@ -377,8 +389,9 @@
+
+ bool RemoveNamespaceRewriteVisitor::VisitRecordTypeLoc(RecordTypeLoc RTLoc)
+ {
+ const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RTLoc.getDecl());
++
+ if (!RD)
+ return true;
+
+ std::string Name;
+@@ -396,8 +409,41 @@
+ dyn_cast<TemplateSpecializationType>(Ty);
+ TransAssert(TST && "Bad TemplateSpecializationType!");
+
+ TemplateName TplName = TST->getTemplateName();
++
++#if LLVM_VERSION_MAJOR >= 22
++ if (TplName.getKind() == TemplateName::DependentTemplate) {
++ DependentTemplateName* DTN = TplName.getAsDependentTemplateName();
++ const IdentifierInfo *IdInfo = DTN->getName().getIdentifier();
++ std::string IdName = IdInfo->getName().str();
++ std::string Name;
++
++ // FIXME:
++ // This isn't quite right, we will generate bad code for some cases, e.g.,
++ // namespace NS1 {
++ // template <class T> struct Base {};
++ // template <class T> struct Derived: public Base<T> {
++ // typename Derived::template Base<double>* p1;
++ // };
++ // }
++ // template <class T> struct Base {};
++ // template <class T> struct Derived: public Base<T> {
++ // typename Derived::template Base<double>* p1;
++ // };
++ // For the global Derived template class, we will end up with
++ // typename Derived::template Tran_NS_NS1_Base ...,
++ // which is obviously wrong.
++ // Any way to avoid this bad transformation?
++ if (ConsumerInstance->getNewNameByName(IdName, Name)) {
++ SourceLocation LocStart = TSPLoc.getTemplateNameLoc();
++ ConsumerInstance->TheRewriter.ReplaceText(
++ LocStart, IdName.size(), Name);
++ }
++ return true;
++ }
++#endif
++
+ const TemplateDecl *TplD = TplName.getAsTemplateDecl();
+ TransAssert(TplD && "Invalid TemplateDecl!");
+ NamedDecl *ND = TplD->getTemplatedDecl();
+ // in some cases, ND could be NULL, e.g., the
+@@ -426,8 +472,9 @@
+
+ return true;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ // handle the case where a template specialization type cannot be resolved, e.g.
+ // template <class T> struct Base {};
+ // template <class T> struct Derived: public Base<T> {
+ // typename Derived::template Base<double>* p1;
+@@ -439,9 +486,14 @@
+ const DependentTemplateSpecializationType *DTST =
+ 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;
+
+ // FIXME:
+@@ -467,13 +519,15 @@
+ }
+
+ return true;
+ }
++#endif
+
+ bool RemoveNamespaceRewriteVisitor::VisitInjectedClassNameTypeLoc(
+ InjectedClassNameTypeLoc TyLoc)
+ {
+ const CXXRecordDecl *CXXRD = TyLoc.getDecl();
++
+ TransAssert(CXXRD && "Invalid CXXRecordDecl!");
+
+ std::string Name;
+ if (ConsumerInstance->getNewName(CXXRD, Name)) {
+@@ -487,9 +541,13 @@
+ }
+
+ bool RemoveNamespaceRewriteVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TyLoc)
+ {
++#if LLVM_VERSION_MAJOR < 22
+ const TypedefNameDecl *D = TyLoc.getTypedefNameDecl();
++#else
++ const TypedefNameDecl *D = TyLoc.getDecl();
++#endif
+
+ std::string Name;
+ if (ConsumerInstance->getNewName(D, Name)) {
+ SourceLocation LocStart = TyLoc.getBeginLoc();
+@@ -502,8 +560,9 @@
+ bool RemoveNamespaceRewriteVisitor::VisitEnumTypeLoc(EnumTypeLoc TyLoc)
+ {
+ const EnumDecl *D = TyLoc.getDecl();
+
++
+ std::string Name;
+ if (ConsumerInstance->getNewName(D, Name)) {
+ SourceLocation LocStart = TyLoc.getBeginLoc();
+ ConsumerInstance->TheRewriter.ReplaceText(
+@@ -541,18 +600,33 @@
+ if (!QualifierLoc || QualifierLoc.getBeginLoc().isInvalid())
+ return true;
+
+ SmallVector<NestedNameSpecifierLoc, 8> QualifierLocs;
++#if LLVM_VERSION_MAJOR < 22
+ for (; QualifierLoc; QualifierLoc = QualifierLoc.getPrefix())
++#else
++ for (; QualifierLoc;
++ QualifierLoc = QualifierLoc.getAsNamespaceAndPrefix().Prefix)
++#endif
+ QualifierLocs.push_back(QualifierLoc);
+
+ while (!QualifierLocs.empty()) {
+ NestedNameSpecifierLoc Loc = QualifierLocs.pop_back_val();
++#if LLVM_VERSION_MAJOR < 22
+ NestedNameSpecifier *NNS = Loc.getNestedNameSpecifier();
++#else
++ NestedNameSpecifier NNSVal = Loc.getNestedNameSpecifier();
++ NestedNameSpecifier *NNS = NNSVal ? &NNSVal : nullptr;
++#endif
++#if LLVM_VERSION_MAJOR < 22
+ NestedNameSpecifier::SpecifierKind Kind = NNS->getKind();
++#else
++ NestedNameSpecifier::Kind Kind = NNS->getKind();
++#endif
+ const NamespaceDecl *ND = NULL;
+
+ switch (Kind) {
++#if LLVM_VERSION_MAJOR < 22
+ case NestedNameSpecifier::Namespace: {
+ ND = NNS->getAsNamespace()->getCanonicalDecl();
+ break;
+ }
+@@ -562,11 +636,29 @@
+ ND = NAD->getNamespace()->getCanonicalDecl();
+ break;
+ }
+ case NestedNameSpecifier::TypeSpec: // Fall-through
++#if LLVM_VERSION_MAJOR <= 20
+ case NestedNameSpecifier::TypeSpecWithTemplate:
++#endif
+ TraverseTypeLoc(Loc.getTypeLoc());
+ break;
++#else
++ case NestedNameSpecifier::Kind::Namespace: {
++ if (auto* NS = dyn_cast<NamespaceDecl>(
++ NNS->getAsNamespaceAndPrefix().Namespace)) {
++ ND = NS->getCanonicalDecl();
++ } else if (auto* NAD = dyn_cast<NamespaceAliasDecl>(
++ NNS->getAsNamespaceAndPrefix().Namespace)) {
++ if (!NAD->getQualifier())
++ ND = NAD->getNamespace()->getCanonicalDecl();
++ }
++ break;
++ }
++ case NestedNameSpecifier::Kind::Type:
++ TraverseTypeLoc(Loc.getAsTypeLoc());
++ break;
++#endif
+ default:
+ break;
+ }
+
+@@ -772,17 +864,25 @@
+ std::string NewName;
+ UsingDecl *D = dyn_cast<UsingDecl>(UD->getIntroducer());
+
+ NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc();
++#if LLVM_VERSION_MAJOR < 22
+ NestedNameSpecifier *NNS = QualifierLoc.getNestedNameSpecifier();
++#else
++ NestedNameSpecifier NNS = QualifierLoc.getNestedNameSpecifier();
++#endif
+
+ // QualifierLoc could be ::foo, whose PrefixLoc is invalid, e.g.,
+ // void foo();
+ // namespace NS2 {
+ // using ::foo;
+ // void bar () { foo(); }
+ // }
++#if LLVM_VERSION_MAJOR < 22
+ if (NNS->getKind() != NestedNameSpecifier::Global) {
++#else
++ if (NNS.getKind() != NestedNameSpecifier::Kind::Global) {
++#endif
+ // NestedNameSpecifierLoc PrefixLoc = QualifierLoc.getPrefix();
+ RewriteHelper->getQualifierAsString(QualifierLoc, NewName);
+ }
+
+@@ -1102,16 +1202,26 @@
+ }
+
+ bool RemoveNamespace::isGlobalNamespace(NestedNameSpecifierLoc Loc)
+ {
++#if LLVM_VERSION_MAJOR < 22
+ NestedNameSpecifier *NNS = Loc.getNestedNameSpecifier();
+ return (NNS->getKind() == NestedNameSpecifier::Global);
++#else
++ NestedNameSpecifier NNS = Loc.getNestedNameSpecifier();
++ return (NNS.getKind() == NestedNameSpecifier::Kind::Global);
++#endif
+ }
+
+ bool RemoveNamespace::isTheNamespaceSpecifier(const NestedNameSpecifier *NNS)
+ {
++#if LLVM_VERSION_MAJOR < 22
+ NestedNameSpecifier::SpecifierKind Kind = NNS->getKind();
++#else
++ NestedNameSpecifier::Kind Kind = NNS->getKind();
++#endif
+ switch (Kind) {
++#if LLVM_VERSION_MAJOR < 22
+ case NestedNameSpecifier::Namespace: {
+ const NamespaceDecl *CanonicalND =
+ NNS->getAsNamespace()->getCanonicalDecl();
+ return (CanonicalND == TheNamespaceDecl);
+@@ -1125,8 +1235,22 @@
+ const NamespaceDecl *CanonicalND =
+ NAD->getNamespace()->getCanonicalDecl();
+ return (CanonicalND == TheNamespaceDecl);
+ }
++#else
++ case NestedNameSpecifier::Kind::Namespace: {
++ const NamespaceDecl* CanonicalND = nullptr;
++ if (auto* NS = dyn_cast<NamespaceDecl>(
++ NNS->getAsNamespaceAndPrefix().Namespace)) {
++ CanonicalND = NS->getCanonicalDecl();
++ } else if (auto* NAD = dyn_cast<NamespaceAliasDecl>(
++ NNS->getAsNamespaceAndPrefix().Namespace)) {
++ if (NAD->getQualifier()) return false;
++ CanonicalND = NAD->getNamespace()->getCanonicalDecl();
++ }
++ return (CanonicalND == TheNamespaceDecl);
++ }
++#endif
+
+ default:
+ return false;
+ }
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RemoveNestedFunction.cpp cvise-2.12.0/clang_delta/RemoveNestedFunction.cpp
+--- cvise-2.12.0--orig/clang_delta/RemoveNestedFunction.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RemoveNestedFunction.cpp 2026-07-17 13:53:45.287068105 +0200
+@@ -282,10 +282,15 @@
+ TransAssert(((DName.getNameKind() == DeclarationName::Identifier) ||
+ (DName.getNameKind() == DeclarationName::CXXOperatorName)) &&
+ "Not an indentifier!");
+ const FunctionDecl *FD = NULL;
++#if LLVM_VERSION_MAJOR < 22
+ if (const NestedNameSpecifier *NNS = UE->getQualifier()) {
+ if (const DeclContext *Ctx = getDeclContextFromSpecifier(NNS)) {
++#else
++ if (const NestedNameSpecifier NNS = UE->getQualifier()) {
++ if (const DeclContext *Ctx = getDeclContextFromSpecifier(&NNS)) {
++#endif
+ DeclContextSet VisitedCtxs;
+ FD = lookupFunctionDecl(DName, Ctx, VisitedCtxs);
+ }
+ }
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RemoveUnusedFunction.cpp cvise-2.12.0/clang_delta/RemoveUnusedFunction.cpp
+--- cvise-2.12.0--orig/clang_delta/RemoveUnusedFunction.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RemoveUnusedFunction.cpp 2026-07-17 14:14:42.080537027 +0200
+@@ -253,9 +253,13 @@
+ }
+
+ 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) ||
+ !ConsumerInstance->hasAtLeastOneValidLocation(CanonicalFD))
+@@ -757,23 +761,35 @@
+ {
+ std::unordered_set<const DeclContext *> seenDeclarations;
+ const FunctionDecl *FD = NULL;
+ switch (NNS->getKind()) {
+- case NestedNameSpecifier::Namespace:
+- FD = lookupFunctionDeclShallow(Name,
+- NNS->getAsNamespace(),
+- seenDeclarations);
++#if LLVM_VERSION_MAJOR < 22
++ case NestedNameSpecifier::Namespace: {
++ const DeclContext *DC = NNS->getAsNamespace();
++ FD = lookupFunctionDeclShallow(Name, DC, seenDeclarations);
+ break;
+- case NestedNameSpecifier::NamespaceAlias:
++ }
++ case NestedNameSpecifier::NamespaceAlias: {
+ FD = lookupFunctionDeclShallow(Name,
+ NNS->getAsNamespaceAlias()->getNamespace(),
+ seenDeclarations);
+ break;
+- case NestedNameSpecifier::Global:
++ }
++ case NestedNameSpecifier::Global: {
++#else
++ case NestedNameSpecifier::Kind::Namespace: {
++ const DeclContext *DC =
++ NNS->getAsNamespaceAndPrefix().Namespace->getDeclContext();
++ FD = lookupFunctionDeclShallow(Name, DC, seenDeclarations);
++ break;
++ }
++ case NestedNameSpecifier::Kind::Global: {
++#endif
+ FD = lookupFunctionDeclShallow(Name,
+ Context->getTranslationUnitDecl(),
+ seenDeclarations);
+ break;
++ }
+ default:
+ return NULL;
+ }
+ return FD;
+@@ -785,9 +801,14 @@
+ if (VisitedUsingDecls.count(UD))
+ return;
+
+ VisitedUsingDecls.insert(UD);
++#if LLVM_VERSION_MAJOR < 22
+ const NestedNameSpecifier *NNS = UD->getQualifier();
++#else
++ const NestedNameSpecifier NNSVal = UD->getQualifier();
++ const NestedNameSpecifier *NNS = NNSVal ? &NNSVal : nullptr;
++#endif
+ if (!NNS)
+ return;
+ DeclarationName Name = UD->getUnderlyingDecl()->getDeclName();
+ const FunctionDecl *FD = getFunctionDeclFromSpecifier(Name, NNS);
+@@ -844,9 +865,14 @@
+ DeclarationName::NameKind K = DName.getNameKind();
+ if ((K != DeclarationName::CXXOperatorName) &&
+ (K != DeclarationName::Identifier))
+ return;
++#if LLVM_VERSION_MAJOR < 22
+ const NestedNameSpecifier *NNS = E->getQualifier();
++#else
++ const NestedNameSpecifier NNSVal = E->getQualifier();
++ const NestedNameSpecifier *NNS = NNSVal ? &NNSVal : nullptr;
++#endif
+ // we fail only if UE is invoked with some qualifier or
+ // instantiation, e.g.:
+ // namespace NS { template<typename T> void foo(T&) { } }
+ // template<typename T> void bar(T p) { NS::foo(p); }
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RemoveUnusedOuterClass.cpp cvise-2.12.0/clang_delta/RemoveUnusedOuterClass.cpp
+--- cvise-2.12.0--orig/clang_delta/RemoveUnusedOuterClass.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RemoveUnusedOuterClass.cpp 2026-07-17 14:00:33.566350773 +0200
+@@ -52,8 +52,9 @@
+
+ bool RemoveUnusedOuterClassVisitor::VisitRecordTypeLoc(RecordTypeLoc TLoc)
+ {
+ const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TLoc.getDecl());
++
+ ConsumerInstance->UsedCXXRDSet.insert(RD->getCanonicalDecl());
+ return true;
+ }
+
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RemoveUnusedStructField.cpp cvise-2.12.0/clang_delta/RemoveUnusedStructField.cpp
+--- cvise-2.12.0--orig/clang_delta/RemoveUnusedStructField.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RemoveUnusedStructField.cpp 2026-07-17 14:00:33.566442546 +0200
+@@ -326,8 +326,9 @@
+ TransAssert(0 && "Bad RecordType!");
+ }
+
+ const RecordDecl *RD = RT->getDecl();
++
+ unsigned int VecSz = IdxVec->size();
+ for (IndexVector::const_iterator FI = IdxVec->begin(),
+ FE = IdxVec->end(); FI != FE; ++FI)
+ {
+@@ -407,9 +408,11 @@
+ if (!Ty->isStructureType())
+ return NULL;
+
+ const RecordType *RT = Ty->getAsStructureType();
+- return RT->getDecl()->getDefinition();
++ const RecordDecl *RD = RT->getDecl();
++
++ return RD->getDefinition();
+ }
+
+ void RemoveUnusedStructField::removeFieldDecl(void)
+ {
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RenameFun.cpp cvise-2.12.0/clang_delta/RenameFun.cpp
+--- cvise-2.12.0--orig/clang_delta/RenameFun.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RenameFun.cpp 2026-07-17 14:14:42.080793420 +0200
+@@ -260,9 +260,15 @@
+ void RenameFun::addFun(const FunctionDecl *FD)
+ {
+ std::string Name = FD->getNameAsString();
+ // Skip special functions
+- if (isSpecialFun(Name) || FD->hasAttr<OpenCLKernelAttr>())
++ if (isSpecialFun(Name) ||
++#if LLVM_VERSION_MAJOR > 20
++ FD->hasAttr<DeviceKernelAttr>()
++#else
++ FD->hasAttr<OpenCLKernelAttr>()
++#endif
++ )
+ FunToNameMap[FD] = Name;
+
+ if (FunToNameMap.find(FD) != FunToNameMap.end())
+ return;
+diff -rNU4 cvise-2.12.0--orig/clang_delta/ReplaceClassWithBaseTemplateSpec.cpp cvise-2.12.0/clang_delta/ReplaceClassWithBaseTemplateSpec.cpp
+--- cvise-2.12.0--orig/clang_delta/ReplaceClassWithBaseTemplateSpec.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/ReplaceClassWithBaseTemplateSpec.cpp 2026-07-17 14:00:33.566542795 +0200
+@@ -79,8 +79,9 @@
+ if (Ty->isUnionType())
+ return true;
+
+ const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TLoc.getDecl());
++
+ if (!RD || (RD->getCanonicalDecl() != ConsumerInstance->TheCXXRecord))
+ return true;
+
+ ConsumerInstance->RewriteHelper->replaceRecordType(
+diff -rNU4 cvise-2.12.0--orig/clang_delta/ReplaceDependentName.cpp cvise-2.12.0/clang_delta/ReplaceDependentName.cpp
+--- cvise-2.12.0--orig/clang_delta/ReplaceDependentName.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/ReplaceDependentName.cpp 2026-07-17 13:53:45.287638059 +0200
+@@ -54,14 +54,16 @@
+ ConsumerInstance->handleOneDependentNameTypeLoc(TLoc);
+ return true;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ bool ReplaceDependentNameCollectionVisitor::VisitElaboratedTypeLoc(
+ ElaboratedTypeLoc TLoc)
+ {
+ ConsumerInstance->handleOneElaboratedTypeLoc(TLoc);
+ return true;
+ }
++#endif
+
+ void ReplaceDependentName::Initialize(ASTContext &context)
+ {
+ Transformation::Initialize(context);
+@@ -93,8 +95,9 @@
+ Ctx.getDiagnostics().hasFatalErrorOccurred())
+ TransError = TransInternalError;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ SourceLocation ReplaceDependentName::getElaboratedTypeLocBegin(
+ const ElaboratedTypeLoc &TLoc)
+ {
+ SourceLocation Loc = TLoc.getElaboratedKeywordLoc();
+@@ -149,8 +152,9 @@
+ TheLocBegin = getElaboratedTypeLocBegin(TLoc);
+ TheNameLocEnd = TLoc.getEndLoc();
+ }
+ }
++#endif
+
+ void ReplaceDependentName::handleOneDependentNameTypeLoc(
+ const DependentNameTypeLoc &TLoc)
+ {
+diff -rNU4 cvise-2.12.0--orig/clang_delta/ReplaceDependentTypedef.cpp cvise-2.12.0/clang_delta/ReplaceDependentTypedef.cpp
+--- cvise-2.12.0--orig/clang_delta/ReplaceDependentTypedef.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/ReplaceDependentTypedef.cpp 2026-07-17 13:53:45.287729571 +0200
+@@ -44,13 +44,66 @@
+
+ static RegisterTransformation<ReplaceDependentTypedef>
+ Trans("replace-dependent-typedef", DescriptionMsg);
+
++static bool DependsOnTypedef(const Type &Ty) {
++ switch (Ty.getTypeClass()) {
++ case Type::SubstTemplateTypeParm: {
++ const SubstTemplateTypeParmType *TP =
++ dyn_cast<SubstTemplateTypeParmType>(&Ty);
++ const Type *ReplTy = TP->getReplacementType().getTypePtr();
++ return DependsOnTypedef(*ReplTy);
++ }
++
++#if LLVM_VERSION_MAJOR < 22
++ case Type::Elaborated: {
++ const ElaboratedType *ETy = dyn_cast<ElaboratedType>(&Ty);
++ const Type *NamedTy = ETy->getNamedType().getTypePtr();
++ return DependsOnTypedef(*NamedTy);
++ }
++#endif
++
++ case Type::Typedef: {
++ return true;
++ }
++
++ case Type::DependentName: {
++ const DependentNameType *DNT = dyn_cast<DependentNameType>(&Ty);
++#if LLVM_VERSION_MAJOR < 22
++ const NestedNameSpecifier *Specifier = DNT->getQualifier();
++#else
++ const NestedNameSpecifier Specifier = DNT->getQualifier();
++#endif
++ if (!Specifier)
++ return false;
++#if LLVM_VERSION_MAJOR < 22
++ const Type *NestedTy = Specifier->getAsType();
++#else
++ const Type *NestedTy = Specifier.getAsType();
++#endif
++ if (!NestedTy)
++ return false;
++ return DependsOnTypedef(*NestedTy);
++ }
++
++ case Type::Record:
++ case Type::Builtin: { // fall-through
++ return false;
++ }
++
++ default:
++ return false;
++ }
++
++ TransAssert(0 && "Unreachable code!");
++ return false;
++}
++
+ class ReplaceDependentTypedefCollectionVisitor : public
+ RecursiveASTVisitor<ReplaceDependentTypedefCollectionVisitor> {
+
+ public:
+- explicit
++ explicit
+ ReplaceDependentTypedefCollectionVisitor(ReplaceDependentTypedef *Instance)
+ : ConsumerInstance(Instance)
+ { }
+
+@@ -60,16 +113,16 @@
+ ReplaceDependentTypedef *ConsumerInstance;
+
+ };
+
+-bool
++bool
+ ReplaceDependentTypedefCollectionVisitor::VisitTypedefNameDecl(TypedefNameDecl *D)
+ {
+ ConsumerInstance->handleOneTypedefDecl(D);
+ return true;
+ }
+
+-void ReplaceDependentTypedef::Initialize(ASTContext &context)
++void ReplaceDependentTypedef::Initialize(ASTContext &context)
+ {
+ Transformation::Initialize(context);
+ CollectionVisitor = new ReplaceDependentTypedefCollectionVisitor(this);
+ }
+@@ -110,8 +163,9 @@
+ case Type::Typedef:
+ case Type::DependentName: // fall-through
+ return true;
+
++#if LLVM_VERSION_MAJOR < 22
+ case Type::Elaborated: {
+ const ElaboratedType *ETy = dyn_cast<ElaboratedType>(Ty);
+ ElaboratedTypeKeyword Keyword = ETy->getKeyword();
+
+@@ -120,9 +174,10 @@
+ #else
+ return ((Keyword == ETK_Typename) || (Keyword == ETK_None));
+ #endif
+ }
+-
++#endif
++
+ default:
+ return false;
+ }
+
+@@ -136,8 +191,10 @@
+ return;
+
+ if (!isValidType(D->getUnderlyingType()))
+ return;
++ if (!DependsOnTypedef(*D->getUnderlyingType()))
++ return;
+
+ std::string Str = "";
+ bool Typename = false;
+ if (!getTypeString(D->getUnderlyingType(), Str, Typename))
+diff -rNU4 cvise-2.12.0--orig/clang_delta/ReplaceSimpleTypedef.cpp cvise-2.12.0/clang_delta/ReplaceSimpleTypedef.cpp
+--- cvise-2.12.0--orig/clang_delta/ReplaceSimpleTypedef.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/ReplaceSimpleTypedef.cpp 2026-07-17 14:00:33.566632104 +0200
+@@ -57,9 +57,11 @@
+ { }
+
+ bool VisitTypedefTypeLoc(TypedefTypeLoc Loc);
+
++#if LLVM_VERSION_MAJOR < 22
+ bool VisitElaboratedTypeLoc(ElaboratedTypeLoc Loc);
++#endif
+
+ private:
+ ReplaceSimpleTypedef *ConsumerInstance;
+
+@@ -96,8 +98,9 @@
+ }
+ return true;
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ // Handle cases like:
+ // struct S {
+ // typedef int Int;
+ // };
+@@ -124,8 +127,9 @@
+ ConsumerInstance->Rewritten = true;
+ }
+ return true;
+ }
++#endif
+
+ void ReplaceSimpleTypedef::Initialize(ASTContext &context)
+ {
+ Transformation::Initialize(context);
+@@ -177,8 +181,9 @@
+ return true;
+
+ if (const RecordType *RDTy = Ty->getAs<RecordType>()) {
+ const RecordDecl *RD = RDTy->getDecl();
++
+ // omit some trivial cases, e.g.,
+ // typedef struct S { int x; } S;
+ if (RD->getNameAsString() == D->getNameAsString())
+ return false;
+diff -rNU4 cvise-2.12.0--orig/clang_delta/RewriteUtils.cpp cvise-2.12.0/clang_delta/RewriteUtils.cpp
+--- cvise-2.12.0--orig/clang_delta/RewriteUtils.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/RewriteUtils.cpp 2026-07-17 14:09:20.860636248 +0200
+@@ -1702,9 +1702,13 @@
+ const IdentifierInfo *TypeId = RTLoc.getType().getBaseTypeIdentifier();
+ if (!TypeId)
+ return true;
+
++#if LLVM_VERSION_MAJOR < 22
+ SourceLocation LocStart = RTLoc.getBeginLoc();
++#else
++ SourceLocation LocStart = RTLoc.getNameLoc();
++#endif
+
+ // Loc could be invalid, for example:
+ // class AAA { };
+ // class BBB:AAA {
+diff -rNU4 cvise-2.12.0--orig/clang_delta/SimplifyDependentTypedef.cpp cvise-2.12.0/clang_delta/SimplifyDependentTypedef.cpp
+--- cvise-2.12.0--orig/clang_delta/SimplifyDependentTypedef.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/SimplifyDependentTypedef.cpp 2026-07-17 13:53:45.288153220 +0200
+@@ -202,13 +202,19 @@
+
+ QualType QT = CanonicalD->getUnderlyingType();
+ const Type *Ty = QT.getTypePtr();
+ Type::TypeClass TC = Ty->getTypeClass();
++#if LLVM_VERSION_MAJOR < 22
+ if ((TC != Type::DependentName) &&
+ (TC != Type::DependentTemplateSpecialization) &&
+ (TC != Type::TemplateSpecialization) &&
+ (TC != Type::Elaborated))
+ return;
++#else
++ if ((TC != Type::DependentName) &&
++ (TC != Type::TemplateSpecialization))
++ return;
++#endif
+
+ TemplateTypeParmTypeVisitor->setTypeSet(&TypeSet);
+ TemplateTypeParmTypeVisitor->setValidType(false);
+ TemplateTypeParmTypeVisitor->TraverseType(QT);
+diff -rNU4 cvise-2.12.0--orig/clang_delta/SimplifyNestedClass.cpp cvise-2.12.0/clang_delta/SimplifyNestedClass.cpp
+--- cvise-2.12.0--orig/clang_delta/SimplifyNestedClass.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/SimplifyNestedClass.cpp 2026-07-17 14:00:33.566720220 +0200
+@@ -77,8 +77,9 @@
+
+ bool SimplifyNestedClassRewriteVisitor::VisitRecordTypeLoc(RecordTypeLoc TLoc)
+ {
+ const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TLoc.getDecl());
++
+ if (!RD || (RD->getCanonicalDecl() !=
+ ConsumerInstance->TheBaseCXXRD->getCanonicalDecl()))
+ return true;
+
+diff -rNU4 cvise-2.12.0--orig/clang_delta/SimplifyStruct.cpp cvise-2.12.0/clang_delta/SimplifyStruct.cpp
+--- cvise-2.12.0--orig/clang_delta/SimplifyStruct.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/SimplifyStruct.cpp 2026-07-17 14:00:33.566813375 +0200
+@@ -99,8 +99,9 @@
+ if (!RT)
+ return true;
+
+ const RecordDecl *NestedRD = RT->getDecl();
++
+ if (NestedRD->getNameAsString() == "")
+ return true;
+
+ ConsumerInstance->ValidInstanceNum++;
+@@ -126,8 +127,9 @@
+ if (!RT)
+ return true;
+
+ const RecordDecl *RD = RT->getDecl();
++
+ if (RD != ConsumerInstance->TheRecordDecl)
+ return true;
+
+ SourceLocation LocStart = VD->getBeginLoc();
+@@ -182,8 +184,9 @@
+ if (Ty->isUnionType())
+ return true;
+
+ RecordDecl *RD = RTLoc.getDecl();
++
+ RecordDecl *CanonicalRD = dyn_cast<RecordDecl>(RD->getCanonicalDecl());
+ if (CanonicalRD != ConsumerInstance->TheRecordDecl)
+ return true;
+
+@@ -217,10 +220,11 @@
+
+ const Type *T = FD->getType().getTypePtr();
+ const RecordType *RT = T->getAs<RecordType>();
+ TransAssert(RT && "Invalid record type!");
+- const RecordDecl *ReplacingRD =
+- dyn_cast<RecordDecl>(RT->getDecl()->getCanonicalDecl());
++ RecordDecl *RTD = RT->getDecl();
++
++ const RecordDecl *ReplacingRD = dyn_cast<RecordDecl>(RTD->getCanonicalDecl());
+ (void)ReplacingRD;
+ TransAssert((ReplacingRD == ConsumerInstance->ReplacingRecordDecl) &&
+ "Unmatched Replacing RD!");
+
+diff -rNU4 cvise-2.12.0--orig/clang_delta/SimplifyStructUnionDecl.cpp cvise-2.12.0/clang_delta/SimplifyStructUnionDecl.cpp
+--- cvise-2.12.0--orig/clang_delta/SimplifyStructUnionDecl.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/SimplifyStructUnionDecl.cpp 2026-07-17 14:00:33.566911080 +0200
+@@ -220,8 +220,9 @@
+ else
+ return NULL;
+
+ return RT->getDecl();
++
+ }
+
+ bool SimplifyStructUnionDecl::handleOneDeclarator(const Type *Ty)
+ {
+diff -rNU4 cvise-2.12.0--orig/clang_delta/TemplateArgToInt.cpp cvise-2.12.0/clang_delta/TemplateArgToInt.cpp
+--- cvise-2.12.0--orig/clang_delta/TemplateArgToInt.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/TemplateArgToInt.cpp 2026-07-17 13:53:45.288531823 +0200
+@@ -324,13 +324,15 @@
+ TemplateArgToInt::getSubstTemplateTypeParmType(const Type *Ty)
+ {
+ Type::TypeClass TC = Ty->getTypeClass();
+ switch (TC) {
++#if LLVM_VERSION_MAJOR < 22
+ case Type::Elaborated: {
+ const ElaboratedType *ETy = dyn_cast<ElaboratedType>(Ty);
+ const Type *NamedT = ETy->getNamedType().getTypePtr();
+ return getSubstTemplateTypeParmType(NamedT);
+ }
++#endif
+
+ case Type::Typedef: {
+ const TypedefType *TdefTy = dyn_cast<TypedefType>(Ty);
+ const TypedefNameDecl *TdefD = TdefTy->getDecl();
+diff -rNU4 cvise-2.12.0--orig/clang_delta/tests/replace-dependent-typedef/test2.cc cvise-2.12.0/clang_delta/tests/replace-dependent-typedef/test2.cc
+--- cvise-2.12.0--orig/clang_delta/tests/replace-dependent-typedef/test2.cc 1970-01-01 01:00:00.000000000 +0100
++++ cvise-2.12.0/clang_delta/tests/replace-dependent-typedef/test2.cc 2026-07-17 13:53:38.929860733 +0200
+@@ -0,0 +1,19 @@
++template <typename T>
++struct A {
++ struct Inner;
++ // This shouldn't be treated as an instance:
++ typedef A::Inner Foo;
++};
++
++template <class T> struct S { typedef T type; };
++
++struct B {
++ struct Inner;
++};
++
++template <typename T>
++struct C {
++ typedef typename S<T>::type::Inner Bar;
++};
++
++typedef C<B>::Bar D;
+diff -rNU4 cvise-2.12.0--orig/clang_delta/tests/replace-dependent-typedef/test2.output cvise-2.12.0/clang_delta/tests/replace-dependent-typedef/test2.output
+--- cvise-2.12.0--orig/clang_delta/tests/replace-dependent-typedef/test2.output 1970-01-01 01:00:00.000000000 +0100
++++ cvise-2.12.0/clang_delta/tests/replace-dependent-typedef/test2.output 2026-07-17 13:53:38.929918442 +0200
+@@ -0,0 +1,19 @@
++template <typename T>
++struct A {
++ struct Inner;
++ // This shouldn't be treated as an instance:
++ typedef A::Inner Foo;
++};
++
++template <class T> struct S { typedef T type; };
++
++struct B {
++ struct Inner;
++};
++
++template <typename T>
++struct C {
++ typedef typename S<T>::type::Inner Bar;
++};
++
++typedef B::Inner D;
+diff -rNU4 cvise-2.12.0--orig/clang_delta/tests/test_clang_delta.py cvise-2.12.0/clang_delta/tests/test_clang_delta.py
+--- cvise-2.12.0--orig/clang_delta/tests/test_clang_delta.py 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/tests/test_clang_delta.py 2026-07-17 13:53:38.930086038 +0200
+@@ -893,8 +893,19 @@
+
+ def test_rename_var_rename_var(self):
+ self.check_clang_delta('rename-var/rename-var.c', '--transformation=rename-var --counter=1')
+
++ def test_replace_derived_class_replace_dependent_typedef_2(self):
++ self.check_query_instances(
++ 'replace-dependent-typedef/test2.cc',
++ '--query-instances=replace-dependent-typedef',
++ 'Available transformation instances: 1',
++ )
++ self.check_clang_delta(
++ 'replace-dependent-typedef/test2.cc',
++ '--transformation=replace-dependent-typedef --counter=1',
++ )
++
+ def test_replace_derived_class_replace_derived1(self):
+ self.check_clang_delta(
+ 'replace-derived-class/replace-derived1.cpp',
+ '--transformation=replace-derived-class --counter=1',
+diff -rNU4 cvise-2.12.0--orig/clang_delta/Transformation.cpp cvise-2.12.0/clang_delta/Transformation.cpp
+--- cvise-2.12.0--orig/clang_delta/Transformation.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/Transformation.cpp 2026-07-17 14:27:56.908516927 +0200
+@@ -603,10 +603,15 @@
+ return TD->getTemplatedDecl();
+
+ if (const UnresolvedUsingValueDecl *UUD =
+ dyn_cast<UnresolvedUsingValueDecl>(*I)) {
++#if LLVM_VERSION_MAJOR < 22
+ const NestedNameSpecifier *NNS = UUD->getQualifier();
+ const DeclContext *DeclCtx = getDeclContextFromSpecifier(NNS);
++#else
++ const NestedNameSpecifier NNS = UUD->getQualifier();
++ const DeclContext *DeclCtx = getDeclContextFromSpecifier(&NNS);
++#endif
+ if (!DeclCtx)
+ continue;
+ if (const FunctionDecl *FD =
+ lookupFunctionDecl(DName, DeclCtx, VisitedCtxs))
+@@ -662,24 +667,44 @@
+
+ const DeclContext *Transformation::getDeclContextFromSpecifier(
+ const NestedNameSpecifier *NNS)
+ {
++#if LLVM_VERSION_MAJOR < 22
+ for (; NNS; NNS = NNS->getPrefix()) {
+ NestedNameSpecifier::SpecifierKind Kind = NNS->getKind();
++#else
++ for (NestedNameSpecifier CurNNS = *NNS; CurNNS;
++ CurNNS = CurNNS.getAsNamespaceAndPrefix().Prefix) {
++ NestedNameSpecifier *NNS = &CurNNS;
++ NestedNameSpecifier::Kind Kind = NNS->getKind();
++#endif
+
+ switch (Kind) {
++#if LLVM_VERSION_MAJOR < 22
+ case NestedNameSpecifier::Namespace: {
+ return NNS->getAsNamespace()->getCanonicalDecl();
+ }
+ case NestedNameSpecifier::NamespaceAlias: {
+ const NamespaceAliasDecl *NAD = NNS->getAsNamespaceAlias();
+ return NAD->getNamespace()->getCanonicalDecl();
+ }
+ case NestedNameSpecifier::TypeSpec: // Fall-through
+- case NestedNameSpecifier::TypeSpecWithTemplate: {
++ case NestedNameSpecifier::TypeSpecWithTemplate:
++#else
++ case NestedNameSpecifier::Kind::Namespace: {
++ const NamespaceDecl *NS = dyn_cast_if_present<NamespaceDecl>(
++ NNS->getAsNamespaceAndPrefix().Namespace);
++ if (!NS)
++ break;
++ return NS->getCanonicalDecl();
++ }
++ case NestedNameSpecifier::Kind::Type:
++#endif
++ {
+ const Type *Ty = NNS->getAsType();
+- if (const RecordType *RT = Ty->getAs<RecordType>())
++ if (const RecordType *RT = Ty->getAs<RecordType>()) {
+ return RT->getDecl();
++ }
+ if (const TypedefType *TT = Ty->getAs<TypedefType>()) {
+ const TypedefNameDecl *TypeDecl = TT->getDecl();
+ const Type *UnderlyingTy = TypeDecl->getUnderlyingType().getTypePtr();
+ if (const RecordType *RT = UnderlyingTy->getAs<RecordType>())
+@@ -741,8 +766,9 @@
+ dyn_cast<TemplateSpecializationType>(Ty);
+ return getBaseDeclFromTemplateSpecializationType(TSTy);
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ case Type::DependentTemplateSpecialization: {
+ return NULL;
+ }
+
+@@ -750,8 +776,9 @@
+ const ElaboratedType *ETy = dyn_cast<ElaboratedType>(Ty);
+ const Type *NamedT = ETy->getNamedType().getTypePtr();
+ return getBaseDeclFromType(NamedT);
+ }
++#endif
+
+ case Type::Paren: {
+ const ParenType *PT = dyn_cast<ParenType>(Ty);
+ const Type *InnerTy = PT->getInnerType().getTypePtr();
+@@ -931,12 +958,19 @@
+ const DependentNameType *DNT = dyn_cast<DependentNameType>(Ty);
+ const IdentifierInfo *IdInfo = DNT->getIdentifier();
+ if (!IdInfo)
+ return false;
++#if LLVM_VERSION_MAJOR < 22
+ const NestedNameSpecifier *Specifier = DNT->getQualifier();
+ if (!Specifier)
+ return false;
+ const Type *DependentTy = Specifier->getAsType();
++#else
++ const NestedNameSpecifier Specifier = DNT->getQualifier();
++ if (!Specifier)
++ return false;
++ const Type *DependentTy = Specifier.getAsType();
++#endif
+ if (!DependentTy)
+ return false;
+
+ const TemplateTypeParmType *ParmTy =
+@@ -1028,12 +1062,19 @@
+ {
+ const IdentifierInfo *IdInfo = DNT->getIdentifier();
+ if (!IdInfo)
+ return false;
++#if LLVM_VERSION_MAJOR < 22
+ const NestedNameSpecifier *Specifier = DNT->getQualifier();
+ if (!Specifier)
+ return false;
+ const Type *Ty = Specifier->getAsType();
++#else
++ const NestedNameSpecifier Specifier = DNT->getQualifier();
++ if (!Specifier)
++ return false;
++ const Type *Ty = Specifier.getAsType();
++#endif
+ if (!Ty)
+ return false;
+ const CXXRecordDecl *Base = getBaseDeclFromType(Ty);
+ if (!Base)
+@@ -1066,12 +1107,14 @@
+ dyn_cast<SubstTemplateTypeParmType>(Ty);
+ return getTypeString(TP->getReplacementType(), Str, Typename);
+ }
+
++#if LLVM_VERSION_MAJOR < 22
+ case Type::Elaborated: {
+ const ElaboratedType *ETy = dyn_cast<ElaboratedType>(Ty);
+ return getTypeString(ETy->getNamedType(), Str, Typename);
+ }
++#endif
+
+ case Type::Typedef: {
+ const TypedefType *TdefTy = dyn_cast<TypedefType>(Ty);
+ const TypedefNameDecl *TdefD = TdefTy->getDecl();
+@@ -1082,10 +1125,19 @@
+ const DependentNameType *DNT = dyn_cast<DependentNameType>(Ty);
+ return getDependentNameTypeString(DNT, Str, Typename);
+ }
+
+- case Type::Record:
+- case Type::Builtin: { // fall-through
++ case Type::Record: {
++#if LLVM_VERSION_MAJOR >= 22
++ const RecordType *RT = dyn_cast<RecordType>(Ty);
++ QualType DQT = RT->desugar();
++ if (DQT != QT)
++ return getTypeString(DQT, Str, Typename);
++#endif
++ [[fallthrough]];
++ }
++
++ case Type::Builtin: {
+ QT.getAsStringInternal(Str, getPrintingPolicy());
+ return true;
+ }
+
+diff -rNU4 cvise-2.12.0--orig/clang_delta/TransformationManager.cpp cvise-2.12.0/clang_delta/TransformationManager.cpp
+--- cvise-2.12.0--orig/clang_delta/TransformationManager.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/TransformationManager.cpp 2026-07-17 14:14:42.081613846 +0200
+@@ -97,13 +97,16 @@
+
+ ClangInstance = new CompilerInstance();
+ assert(ClangInstance);
+
+- ClangInstance->createDiagnostics(
+-#if LLVM_VERSION_MAJOR >= 20
+- *llvm::vfs::getRealFileSystem()
++#if LLVM_VERSION_MAJOR < 20
++ ClangInstance->createDiagnostics();
++#elif LLVM_VERSION_MAJOR < 22
++ ClangInstance->createDiagnostics(*llvm::vfs::getRealFileSystem());
++#else
++ ClangInstance->createVirtualFileSystem(llvm::vfs::getRealFileSystem());
++ ClangInstance->createDiagnostics();
+ #endif
+- );
+
+ TargetOptions &TargetOpts = ClangInstance->getTargetOpts();
+ if (const char *env = getenv("CVISE_TARGET_TRIPLE")) {
+ TargetOpts.Triple = std::string(env);
+@@ -162,9 +165,14 @@
+
+ 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);
+ }
+
+@@ -185,9 +193,14 @@
+ }
+
+ 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("CVISE_INCLUDE_PATH")) {
+ HeaderSearchOptions &HeaderSearchOpts = ClangInstance->getHeaderSearchOpts();
+@@ -204,9 +217,13 @@
+ } while(next != npos);
+ }
+
+ ClangInstance->createFileManager();
++#if LLVM_VERSION_MAJOR < 22
+ ClangInstance->createSourceManager(ClangInstance->getFileManager());
++#else
++ ClangInstance->createSourceManager();
++#endif
+ ClangInstance->createPreprocessor(TU_Complete);
+
+ DiagnosticConsumer &DgClient = ClangInstance->getDiagnosticClient();
+ DgClient.BeginSourceFile(ClangInstance->getLangOpts(),
+diff -rNU4 cvise-2.12.0--orig/clang_delta/UnionToStruct.cpp cvise-2.12.0/clang_delta/UnionToStruct.cpp
+--- cvise-2.12.0--orig/clang_delta/UnionToStruct.cpp 2025-09-23 22:51:29.000000000 +0200
++++ cvise-2.12.0/clang_delta/UnionToStruct.cpp 2026-07-17 14:00:33.567272221 +0200
+@@ -407,9 +407,9 @@
+ TransAssert(RDTy && "Bad RecordType!");
+ if (RDTy->isIncompleteType())
+ return;
+
+- const RecordDecl *RD = RDTy->getDecl();
++ const RecordDecl *RD = RDTy->getDecl();
+ const RecordDecl *CanonicalRD =
+ dyn_cast<RecordDecl>(RD->getCanonicalDecl());
+ TransAssert(CanonicalRD && "NULL CanonicalRD!");
+ if (CanonicalRD->getNameAsString() == "") {
diff --git a/sources b/sources
index bc77a5d..569811b 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (v2.11.0.tar.gz) = 4c0844f1ce0596a7aed84018ecf63fbed31e7fb474d341f9947e99ee61274713ad8ae5dce619fcbc7b2acdddb950b1418989e9cd6cd6d7a2031e56226ccf9f57
+SHA512 (v2.12.0.tar.gz) = 1561e8e7c96cfb4d24be4ffb3b8ee3c9148a715a636252a52d79f02e10ea61db285979c53ad51c797b39bc750e74682942af858187fdbf3d96d9978f8f8301b2
reply other threads:[~2026-08-05 19:28 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178595809533.1.10373673727319849883.rpms-cvise-ab282320661c@fedoraproject.org \
--to=fedora@svgames.pl \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox