[clang] [clang] apply clang-tidy's llvm-redundant-casting (NFC) (PR #191322)

Henrik G. Olsson via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 15 17:04:34 PDT 2026


https://github.com/hnrklssn updated https://github.com/llvm/llvm-project/pull/191322

>From 8cd082c45382163b28c414e14ab5f091bfa9e98a Mon Sep 17 00:00:00 2001
From: "Henrik G. Olsson" <h_olsson at apple.com>
Date: Thu, 9 Apr 2026 16:16:55 -0700
Subject: [PATCH 1/6] [clang] apply clang-tidy's llvm-redundant-casting (NFC)

This applies the clang-tidy check recently added in
https://github.com/llvm/llvm-project/pull/189274 to the `clang/`
subdirectory. A few false positives had to be filtered out:
 - casting the two branches of a ternary expression to match each other
 - casting for an argument that participates in template deduction

I will address those cases in a separate PR to clang-tidy to avoid false
positives going forward.
---
 clang/lib/AST/ASTImporter.cpp                    |  9 ++++-----
 clang/lib/AST/ASTStructuralEquivalence.cpp       |  4 ++--
 clang/lib/AST/ByteCode/Interp.cpp                |  4 ++--
 clang/lib/AST/CXXInheritance.cpp                 |  2 +-
 clang/lib/AST/ComputeDependence.cpp              |  2 +-
 clang/lib/AST/DeclCXX.cpp                        | 10 +++++-----
 clang/lib/AST/DeclObjC.cpp                       |  4 ++--
 clang/lib/AST/ExprCXX.cpp                        |  2 +-
 clang/lib/AST/ExprConstant.cpp                   |  2 +-
 clang/lib/AST/ItaniumMangle.cpp                  |  2 +-
 clang/lib/AST/MicrosoftMangle.cpp                |  6 +++---
 clang/lib/AST/StmtCXX.cpp                        |  2 +-
 clang/lib/AST/StmtPrinter.cpp                    |  2 +-
 clang/lib/AST/TextNodeDumper.cpp                 |  2 +-
 clang/lib/Analysis/AnalysisDeclContext.cpp       |  2 +-
 clang/lib/Analysis/CFG.cpp                       |  2 +-
 clang/lib/Analysis/Consumed.cpp                  |  2 +-
 clang/lib/Analysis/LifetimeSafety/Checker.cpp    |  2 +-
 clang/lib/Analysis/ThreadSafetyCommon.cpp        |  6 +++---
 clang/lib/CodeGen/CGBuiltin.cpp                  |  2 +-
 clang/lib/CodeGen/CGDebugInfo.cpp                |  8 ++++----
 clang/lib/CodeGen/CGDecl.cpp                     |  4 ++--
 clang/lib/CodeGen/CGExprConstant.cpp             |  2 +-
 clang/lib/CodeGen/CGObjCGNU.cpp                  |  4 ++--
 clang/lib/CodeGen/CGOpenMPRuntime.cpp            |  6 +++---
 clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp         |  4 ++--
 clang/lib/CodeGen/CGStmtOpenMP.cpp               |  4 ++--
 clang/lib/CodeGen/CodeGenSYCL.cpp                |  2 +-
 clang/lib/CodeGen/ItaniumCXXABI.cpp              |  4 ++--
 clang/lib/ExtractAPI/DeclarationFragments.cpp    |  4 ++--
 clang/lib/Interpreter/Interpreter.cpp            |  2 +-
 clang/lib/Interpreter/InterpreterUtils.cpp       |  2 +-
 clang/lib/Parse/ParseCXXInlineMethods.cpp        |  2 +-
 clang/lib/Sema/AnalysisBasedWarnings.cpp         |  6 +++---
 clang/lib/Sema/ScopeInfo.cpp                     |  2 +-
 clang/lib/Sema/SemaAvailability.cpp              |  2 +-
 clang/lib/Sema/SemaBoundsSafety.cpp              |  2 +-
 clang/lib/Sema/SemaCodeComplete.cpp              |  4 ++--
 clang/lib/Sema/SemaConcept.cpp                   |  2 +-
 clang/lib/Sema/SemaCoroutine.cpp                 |  2 +-
 clang/lib/Sema/SemaExpr.cpp                      |  2 +-
 clang/lib/Sema/SemaExprCXX.cpp                   |  2 +-
 clang/lib/Sema/SemaInit.cpp                      |  4 ++--
 clang/lib/Sema/SemaOpenMP.cpp                    |  6 +++---
 clang/lib/Sema/SemaOverload.cpp                  |  2 +-
 clang/lib/Sema/SemaTemplate.cpp                  | 16 ++++++++--------
 clang/lib/Sema/SemaTemplateInstantiate.cpp       |  4 ++--
 clang/lib/Sema/SemaTemplateInstantiateDecl.cpp   |  7 +++----
 clang/lib/Sema/SemaType.cpp                      |  6 +++---
 clang/lib/Serialization/ASTReader.cpp            |  7 ++++---
 clang/lib/Serialization/ASTReaderDecl.cpp        |  6 +++---
 clang/lib/Serialization/ASTReaderStmt.cpp        |  2 +-
 .../Checkers/IvarInvalidationChecker.cpp         |  4 ++--
 .../StaticAnalyzer/Checkers/MallocChecker.cpp    |  2 +-
 .../lib/StaticAnalyzer/Checkers/MoveChecker.cpp  |  2 +-
 .../StaticAnalyzer/Core/BugReporterVisitors.cpp  |  2 +-
 clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp    |  2 +-
 clang/lib/StaticAnalyzer/Core/MemRegion.cpp      |  2 +-
 clang/lib/Tooling/Refactoring/Lookup.cpp         |  4 ++--
 59 files changed, 109 insertions(+), 110 deletions(-)

diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index 41ba98c53247d..c4c1456da9193 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -8525,7 +8525,7 @@ ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
     return std::move(Err);
 
   if (!ToTemporaryExpr)
-    ToTemporaryExpr = cast<Expr>(ToMaterializedDecl->getTemporaryExpr());
+    ToTemporaryExpr = ToMaterializedDecl->getTemporaryExpr();
 
   auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr(
       ToType, ToTemporaryExpr, E->isBoundToLvalueReference(),
@@ -8880,7 +8880,7 @@ ASTNodeImporter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
   UnresolvedSet<8> ToDecls;
   for (auto *D : E->decls())
     if (auto ToDOrErr = import(D))
-      ToDecls.addDecl(cast<NamedDecl>(*ToDOrErr));
+      ToDecls.addDecl(*ToDOrErr);
     else
       return ToDOrErr.takeError();
 
@@ -9364,8 +9364,7 @@ Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
   Error ImportErrors = Error::success();
   for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
     if (auto ImportedOrErr = import(FromOverriddenMethod))
-      ToMethod->getCanonicalDecl()->addOverriddenMethod(cast<CXXMethodDecl>(
-          (*ImportedOrErr)->getCanonicalDecl()));
+      ToMethod->getCanonicalDecl()->addOverriddenMethod((*ImportedOrErr)->getCanonicalDecl());
     else
       ImportErrors =
           joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
@@ -10033,7 +10032,7 @@ Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
 }
 
 Expected<Expr *> ASTImporter::Import(Expr *FromE) {
-  if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))
+  if (ExpectedStmt ToSOrErr = Import(FromE))
     return cast_or_null<Expr>(*ToSOrErr);
   else
     return ToSOrErr.takeError();
diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp
index 9d970651a9e65..c3fd0545d4adb 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -2464,8 +2464,8 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   if (D1->getAccessControl() != D2->getAccessControl())
     return false;
 
-  return IsStructurallyEquivalent(Context, cast<FieldDecl>(D1),
-                                  cast<FieldDecl>(D2), Owner2Type);
+  return IsStructurallyEquivalent(Context, D1,
+                                  D2, Owner2Type);
 }
 
 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 8cc3c9216f7f4..49033d5adb914 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -444,7 +444,7 @@ bool CheckConstant(InterpState &S, CodePtr OpPC, const Descriptor *Desc) {
   // If we're evaluating the initializer for a constexpr variable in C23, we may
   // only read other contexpr variables. Abort here since this one isn't
   // constexpr.
-  if (const auto *VD = dyn_cast_if_present<VarDecl>(S.EvaluatingDecl);
+  if (const auto *VD = S.EvaluatingDecl;
       VD && VD->isConstexpr() && S.getLangOpts().C23)
     return Invalid(S, OpPC);
 
@@ -1772,7 +1772,7 @@ bool CallVirt(InterpState &S, CodePtr OpPC, const Function *Func,
     return false;
   assert(DynamicDecl);
 
-  const auto *StaticDecl = cast<CXXRecordDecl>(Func->getParentDecl());
+  const auto *StaticDecl = Func->getParentDecl();
   const auto *InitialFunction = cast<CXXMethodDecl>(Callee);
   const CXXMethodDecl *Overrider;
 
diff --git a/clang/lib/AST/CXXInheritance.cpp b/clang/lib/AST/CXXInheritance.cpp
index 29f5916284ebb..90fd48ff68763 100644
--- a/clang/lib/AST/CXXInheritance.cpp
+++ b/clang/lib/AST/CXXInheritance.cpp
@@ -453,7 +453,7 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD,
   unsigned SubobjectNumber = 0;
   if (!VirtualBase)
     SubobjectNumber
-      = ++SubobjectCount[cast<CXXRecordDecl>(RD->getCanonicalDecl())];
+      = ++SubobjectCount[RD->getCanonicalDecl()];
 
   for (const auto &Base : RD->bases()) {
     if (const auto *BaseDecl = Base.getType()->getAsCXXRecordDecl()) {
diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp
index 34167eee8d8f2..6cb60eb928350 100644
--- a/clang/lib/AST/ComputeDependence.cpp
+++ b/clang/lib/AST/ComputeDependence.cpp
@@ -154,7 +154,7 @@ ExprDependence clang::computeDependence(ExplicitCastExpr *E) {
   // dependent, but it may be deduced as a dependent type.
   ExprDependence D =
       toExprDependenceAsWritten(
-          cast<ExplicitCastExpr>(E)->getTypeAsWritten()->getDependence()) |
+          E->getTypeAsWritten()->getDependence()) |
       toExprDependenceForImpliedType(E->getType()->getDependence());
   if (auto *S = E->getSubExpr())
     D |= S->getDependence() & ~ExprDependence::Type;
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 3b9d888bb2c0a..8fad1e2c6edae 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -1779,7 +1779,7 @@ CXXMethodDecl *CXXRecordDecl::getLambdaStaticInvoker(CallingConv CC) const {
 
   for (NamedDecl *ND : Invoker) {
     const auto *FTy =
-        cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<FunctionType>();
+        ND->getAsFunction()->getType()->castAs<FunctionType>();
     if (FTy->getCallConv() == CC)
       return getInvokerAsMethod(ND);
   }
@@ -3169,7 +3169,7 @@ void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
         this, OD, ASTContext::OperatorDeleteKind::Regular);
     getCanonicalDecl()->OperatorDeleteThisArg = ThisArg;
     if (auto *L = getASTMutationListener())
-      L->ResolvedOperatorDelete(cast<CXXDestructorDecl>(getCanonicalDecl()), OD,
+      L->ResolvedOperatorDelete(getCanonicalDecl(), OD,
                                 ThisArg);
   }
 }
@@ -3187,7 +3187,7 @@ void CXXDestructorDecl::setOperatorGlobalDelete(FunctionDecl *OD) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::GlobalRegular);
     if (auto *L = getASTMutationListener())
-      L->ResolvedOperatorGlobDelete(cast<CXXDestructorDecl>(getCanonicalDecl()),
+      L->ResolvedOperatorGlobDelete(getCanonicalDecl(),
                                     OD);
   }
 }
@@ -3201,7 +3201,7 @@ void CXXDestructorDecl::setOperatorArrayDelete(FunctionDecl *OD) {
         this, OD, ASTContext::OperatorDeleteKind::Array);
     if (auto *L = getASTMutationListener())
       L->ResolvedOperatorArrayDelete(
-          cast<CXXDestructorDecl>(getCanonicalDecl()), OD);
+          getCanonicalDecl(), OD);
   }
 }
 
@@ -3215,7 +3215,7 @@ void CXXDestructorDecl::setGlobalOperatorArrayDelete(FunctionDecl *OD) {
         this, OD, ASTContext::OperatorDeleteKind::ArrayGlobal);
     if (auto *L = getASTMutationListener())
       L->ResolvedOperatorGlobArrayDelete(
-          cast<CXXDestructorDecl>(getCanonicalDecl()), OD);
+          getCanonicalDecl(), OD);
   }
 }
 
diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp
index a66eb72981084..f67da713cfd76 100644
--- a/clang/lib/AST/DeclObjC.cpp
+++ b/clang/lib/AST/DeclObjC.cpp
@@ -264,7 +264,7 @@ ObjCPropertyDecl *ObjCContainerDecl::FindPropertyDeclaration(
   }
 
   if (ObjCPropertyDecl *PD =
-        ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(this), PropertyId,
+        ObjCPropertyDecl::findPropertyDecl(this, PropertyId,
                                            QueryKind))
     return PD;
 
@@ -386,7 +386,7 @@ ObjCPropertyDecl *ObjCInterfaceDecl::FindPropertyVisibleInPrimaryClass(
     LoadExternalDefinition();
 
   if (ObjCPropertyDecl *PD =
-      ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(this), PropertyId,
+      ObjCPropertyDecl::findPropertyDecl(this, PropertyId,
                                          QueryKind))
     return PD;
 
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index dd603bf548926..4ac7aa5355f8b 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -1351,7 +1351,7 @@ Stmt *LambdaExpr::getBody() const {
 const CompoundStmt *LambdaExpr::getCompoundStmtBody() const {
   Stmt *Body = getBody();
   if (const auto *CoroBody = dyn_cast<CoroutineBodyStmt>(Body))
-    return cast<CompoundStmt>(CoroBody->getBody());
+    return CoroBody->getBody();
   return cast<CompoundStmt>(Body);
 }
 
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 4f45fa728c605..56154fd0e9eca 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -9392,7 +9392,7 @@ bool LValueExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
 
   if (isa<FunctionDecl, MSGuidDecl, TemplateParamObjectDecl,
           UnnamedGlobalConstantDecl>(D))
-    return Success(cast<ValueDecl>(D));
+    return Success(D);
   if (const VarDecl *VD = dyn_cast<VarDecl>(D))
     return VisitVarDecl(E, VD);
   if (const BindingDecl *BD = dyn_cast<BindingDecl>(D))
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index f58faa03bfa8c..9ffe31c71e919 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -4655,7 +4655,7 @@ void CXXNameMangler::mangleType(const DependentBitIntType *T) {
 }
 
 void CXXNameMangler::mangleType(const ArrayParameterType *T) {
-  mangleType(cast<ConstantArrayType>(T));
+  mangleType(T);
 }
 
 void CXXNameMangler::mangleType(const HLSLAttributedResourceType *T) {
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index 20c52969d7024..d0e15e9bbad57 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -3246,11 +3246,11 @@ void MicrosoftCXXNameMangler::mangleTagTypeKind(TagTypeKind TTK) {
 }
 void MicrosoftCXXNameMangler::mangleType(const EnumType *T, Qualifiers,
                                          SourceRange) {
-  mangleType(cast<TagType>(T)->getDecl());
+  mangleType(T->getDecl());
 }
 void MicrosoftCXXNameMangler::mangleType(const RecordType *T, Qualifiers,
                                          SourceRange) {
-  mangleType(cast<TagType>(T)->getDecl());
+  mangleType(T->getDecl());
 }
 void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) {
   // MSVC chooses the tag kind of the definition if it exists, otherwise it
@@ -3347,7 +3347,7 @@ void MicrosoftCXXNameMangler::mangleArrayType(const ArrayType *T) {
 
 void MicrosoftCXXNameMangler::mangleType(const ArrayParameterType *T,
                                          Qualifiers, SourceRange) {
-  mangleArrayType(cast<ConstantArrayType>(T));
+  mangleArrayType(T);
 }
 
 // <type>                   ::= <pointer-to-member-type>
diff --git a/clang/lib/AST/StmtCXX.cpp b/clang/lib/AST/StmtCXX.cpp
index 6a69fe75136f3..6ba5b7450cafd 100644
--- a/clang/lib/AST/StmtCXX.cpp
+++ b/clang/lib/AST/StmtCXX.cpp
@@ -75,7 +75,7 @@ const Expr *CXXForRangeStmt::getRangeInit() const {
 }
 
 VarDecl *CXXForRangeStmt::getLoopVariable() {
-  Decl *LV = cast<DeclStmt>(getLoopVarStmt())->getSingleDecl();
+  Decl *LV = getLoopVarStmt()->getSingleDecl();
   assert(LV && "No loop variable in CXXForRangeStmt");
   return cast<VarDecl>(LV);
 }
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index 4d364fdcd5502..e060775127ec2 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -2121,7 +2121,7 @@ void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
     PrintExpr(Node->getImplicitObjectArgument());
     return;
   }
-  VisitCallExpr(cast<CallExpr>(Node));
+  VisitCallExpr(Node);
 }
 
 void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp
index 250ec8b666e05..b3b3e500f62d9 100644
--- a/clang/lib/AST/TextNodeDumper.cpp
+++ b/clang/lib/AST/TextNodeDumper.cpp
@@ -831,7 +831,7 @@ void TextNodeDumper::Visit(const APValue &Value, QualType Ty) {
     {
       ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
       if (const FieldDecl *FD = Value.getUnionField())
-        OS << " ." << *cast<NamedDecl>(FD);
+        OS << " ." << *FD;
     }
     // If the union value is considered to be simple, fold it into the
     // current line to save some vertical space.
diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp
index 266d20632e3cc..c3065b35f156e 100644
--- a/clang/lib/Analysis/AnalysisDeclContext.cpp
+++ b/clang/lib/Analysis/AnalysisDeclContext.cpp
@@ -119,7 +119,7 @@ Stmt *AnalysisDeclContext::getBody(bool &IsAutosynthesized) const {
     return FunTmpl->getTemplatedDecl()->getBody();
   else if (const auto *VD = dyn_cast_or_null<VarDecl>(D)) {
     if (VD->isFileVarDecl()) {
-      return const_cast<Stmt *>(dyn_cast_or_null<Stmt>(VD->getInit()));
+      return const_cast<Expr *>(VD->getInit());
     }
   }
 
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp
index 543b9d8424488..07233f8328638 100644
--- a/clang/lib/Analysis/CFG.cpp
+++ b/clang/lib/Analysis/CFG.cpp
@@ -6124,7 +6124,7 @@ static void print_elem(raw_ostream &OS, StmtPrinterHelper &Helper,
       return;
     CXXDeleteExpr *DelExpr =
         const_cast<CXXDeleteExpr*>(DE.getDeleteExpr());
-    Helper.handledStmt(cast<Stmt>(DelExpr->getArgument()), OS);
+    Helper.handledStmt(DelExpr->getArgument(), OS);
     OS << "->~" << RD->getName().str() << "()";
     OS << " (Implicit destructor)";
     break;
diff --git a/clang/lib/Analysis/Consumed.cpp b/clang/lib/Analysis/Consumed.cpp
index efc7098e52042..67930e38da885 100644
--- a/clang/lib/Analysis/Consumed.cpp
+++ b/clang/lib/Analysis/Consumed.cpp
@@ -804,7 +804,7 @@ void ConsumedStmtVisitor::VisitCXXMemberCallExpr(
 
 void ConsumedStmtVisitor::VisitCXXOperatorCallExpr(
     const CXXOperatorCallExpr *Call) {
-  const auto *FunDecl = dyn_cast_or_null<FunctionDecl>(Call->getDirectCallee());
+  const auto *FunDecl = Call->getDirectCallee();
   if (!FunDecl) return;
 
   if (Call->getOperator() == OO_Equal) {
diff --git a/clang/lib/Analysis/LifetimeSafety/Checker.cpp b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
index 36477c6f67b52..7b7d1c1bec78e 100644
--- a/clang/lib/Analysis/LifetimeSafety/Checker.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
@@ -344,7 +344,7 @@ class LifetimeChecker {
     for (auto [Target, EscapeExpr] : AnnotationWarningsMap) {
       if (const auto *MD = Target.dyn_cast<const CXXMethodDecl *>()) {
         if (!implicitObjectParamIsLifetimeBound(MD))
-          SemaHelper->addLifetimeBoundToImplicitThis(cast<CXXMethodDecl>(MD));
+          SemaHelper->addLifetimeBoundToImplicitThis(MD);
       } else if (const auto *PVD = Target.dyn_cast<const ParmVarDecl *>()) {
         const auto *FD = dyn_cast<FunctionDecl>(PVD->getDeclContext());
         if (!FD)
diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp
index b43a986521f99..685a3ad87ec8e 100644
--- a/clang/lib/Analysis/ThreadSafetyCommon.cpp
+++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp
@@ -480,7 +480,7 @@ til::SExpr *SExprBuilder::translateObjCIVarRefExpr(const ObjCIvarRefExpr *IVRE,
   til::SExpr *BE = translate(IVRE->getBase(), Ctx);
   til::SExpr *E = new (Arena) til::SApply(BE);
 
-  const auto *D = cast<ObjCIvarDecl>(IVRE->getDecl()->getCanonicalDecl());
+  const auto *D = IVRE->getDecl()->getCanonicalDecl();
 
   til::Project *P = new (Arena) til::Project(E, D);
   if (hasAnyPointerType(BE))
@@ -526,7 +526,7 @@ til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
       // return E;
     }
   }
-  return translateCallExpr(cast<CallExpr>(ME), Ctx,
+  return translateCallExpr(ME, Ctx,
                            ME->getImplicitObjectArgument());
 }
 
@@ -541,7 +541,7 @@ til::SExpr *SExprBuilder::translateCXXOperatorCallExpr(
       // return E;
     }
   }
-  return translateCallExpr(cast<CallExpr>(OCE), Ctx);
+  return translateCallExpr(OCE, Ctx);
 }
 
 til::SExpr *SExprBuilder::translateUnaryOperator(const UnaryOperator *UO,
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 4d74d681cd320..0418503ea8066 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4235,7 +4235,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
       // requires the reassoc FMF flag.
       llvm::FastMathFlags FMF;
       FMF.setAllowReassoc();
-      cast<llvm::CallBase>(Reduce)->setFastMathFlags(FMF);
+      Reduce->setFastMathFlags(FMF);
     }
     return RValue::get(Reduce);
   }
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index c5a92a8e7ceb0..fc48a238648dd 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2702,7 +2702,7 @@ CGDebugInfo::CollectTemplateParams(std::optional<TemplateArgs> OArgs,
         V = V->stripPointerCasts();
       }
       TemplateParams.push_back(DBuilder.createTemplateValueParameter(
-          TheCU, Name, TTy, defaultParameter, cast_or_null<llvm::Constant>(V)));
+          TheCU, Name, TTy, defaultParameter, V));
     } break;
     case TemplateArgument::NullPtr: {
       QualType T = TA.getNullPtrType();
@@ -3268,7 +3268,7 @@ void CGDebugInfo::completeRequiredType(const RecordDecl *RD) {
 
 llvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) {
   RecordDecl *RD = Ty->getDecl()->getDefinitionOrSelf();
-  llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0)));
+  llvm::DIType *T = getTypeOrNull(QualType(Ty, 0));
   if (T || shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD,
                                 CGM.getLangOpts())) {
     if (!T)
@@ -4664,7 +4664,7 @@ CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
       !VD->isExternallyVisible(), nullptr, TemplateParameters, Align);
   FwdDeclReplaceMap.emplace_back(
       std::piecewise_construct,
-      std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())),
+      std::make_tuple(VD->getCanonicalDecl()),
       std::make_tuple(static_cast<llvm::Metadata *>(GV)));
   return GV;
 }
@@ -4694,7 +4694,7 @@ llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) {
   if (IE != ImportedDeclCache.end()) {
     auto N = IE->second;
     if (auto *GVE = dyn_cast_or_null<llvm::DIImportedEntity>(N))
-      return cast<llvm::DINode>(GVE);
+      return GVE;
     return dyn_cast_or_null<llvm::DINode>(N);
   }
 
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp
index 748362105cb02..486891eac21b7 100644
--- a/clang/lib/CodeGen/CGDecl.cpp
+++ b/clang/lib/CodeGen/CGDecl.cpp
@@ -297,7 +297,7 @@ llvm::Constant *CodeGenModule::getOrCreateStaticVarDecl(
     setTLSMode(GV, D);
 
   setGVProperties(GV, &D);
-  getTargetCodeGenInfo().setTargetAttributes(cast<Decl>(&D), GV, *this);
+  getTargetCodeGenInfo().setTargetAttributes(&D, GV, *this);
 
   // Make sure the result is of the correct type.
   LangAS ExpectedAS = Ty.getAddressSpace();
@@ -1073,7 +1073,7 @@ static llvm::Constant *constStructWithPadding(CodeGenModule &CGM,
     if (constant->isNullValue())
       CurOp = llvm::Constant::getNullValue(STy->getElementType(i));
     else
-      CurOp = cast<llvm::Constant>(constant->getAggregateElement(i));
+      CurOp = constant->getAggregateElement(i);
     auto *NewOp = constWithPadding(CGM, isPattern, CurOp);
     if (CurOp != NewOp)
       NestedIntact = false;
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index 24712d3325b2e..4dabf3f5a761e 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -2410,7 +2410,7 @@ ConstantLValueEmitter::VisitObjCCollectionElement(const Expr *E) {
 
   llvm::Type *DstTy = CGM.getTypes().ConvertType(DestTy);
   ConstantLValue LV = Visit(Elm);
-  llvm::Constant *ConstVal = cast<llvm::Constant>(LV.Value);
+  llvm::Constant *ConstVal = LV.Value;
   llvm::Constant *Val = llvm::ConstantExpr::getBitCast(ConstVal, DstTy);
   return Val;
 }
diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp
index 9742b496cbf5a..28a92e8c74e33 100644
--- a/clang/lib/CodeGen/CGObjCGNU.cpp
+++ b/clang/lib/CodeGen/CGObjCGNU.cpp
@@ -1284,7 +1284,7 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
         else if (OID->hasAttr<DLLExportAttr>())
           Storage = llvm::GlobalValue::DLLExportStorageClass;
 
-        cast<llvm::GlobalValue>(ClassSymbol)->setDLLStorageClass(Storage);
+        ClassSymbol->setDLLStorageClass(Storage);
       }
     }
     assert(ClassSymbol->getName() == SymbolName);
@@ -1990,7 +1990,7 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
       // we can't import a class struct.
       if (OID->getClassInterface()->hasAttr<DLLExportAttr>()) {
         classStruct->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
-        cast<llvm::GlobalValue>(classRefSymbol)->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
+        classRefSymbol->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
       }
 
       if (SuperClass) {
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 332b439c87472..ae40b838c04e4 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -11274,7 +11274,7 @@ bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
   // the normal code generation.
   if (!CGM.getLangOpts().OpenMPIsTargetDevice) {
     if (const auto *FD = dyn_cast<FunctionDecl>(GD.getDecl()))
-      if (isAssumedToBeNotEmitted(cast<ValueDecl>(FD),
+      if (isAssumedToBeNotEmitted(FD,
                                   CGM.getLangOpts().OpenMPIsTargetDevice))
         return true;
     return false;
@@ -11285,7 +11285,7 @@ bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
   if (const auto *FD = dyn_cast<FunctionDecl>(VD)) {
     StringRef Name = CGM.getMangledName(GD);
     scanForTargetRegionsFunctions(FD->getBody(), Name);
-    if (isAssumedToBeNotEmitted(cast<ValueDecl>(FD),
+    if (isAssumedToBeNotEmitted(FD,
                                 CGM.getLangOpts().OpenMPIsTargetDevice))
       return true;
   }
@@ -12884,7 +12884,7 @@ void CGOpenMPRuntime::emitLastprivateConditionalUpdate(CodeGenFunction &CGF,
   // decltype(priv_a) last_a;
   llvm::GlobalVariable *Last = OMPBuilder.getOrCreateInternalVariable(
       CGF.ConvertTypeForMem(LVal.getType()), UniqueDeclName);
-  cast<llvm::GlobalVariable>(Last)->setAlignment(
+  Last->setAlignment(
       LVal.getAlignment().getAsAlign());
   LValue LastLVal =
       CGF.MakeRawAddrLValue(Last, LVal.getType(), LVal.getAlignment());
diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
index 943c2ac9f8491..9909584a6f60f 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
@@ -947,8 +947,8 @@ llvm::Function *CGOpenMPRuntimeGPU::emitParallelOutlinedFunction(
   bool PrevIsInTTDRegion = IsInTTDRegion;
   IsInTTDRegion = false;
   auto *OutlinedFun =
-      cast<llvm::Function>(CGOpenMPRuntime::emitParallelOutlinedFunction(
-          CGF, D, ThreadIDVar, InnermostKind, CodeGen));
+      CGOpenMPRuntime::emitParallelOutlinedFunction(
+          CGF, D, ThreadIDVar, InnermostKind, CodeGen);
   IsInTTDRegion = PrevIsInTTDRegion;
   if (getExecutionMode() != CGOpenMPRuntimeGPU::EM_SPMD) {
     llvm::Function *WrapperFun =
diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index 990ec47488465..65dd1b24692cb 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -2453,7 +2453,7 @@ void CodeGenFunction::EmitOMPInnerLoop(
   const SourceRange R = S.getSourceRange();
 
   // If attributes are attached, push to the basic block with them.
-  const auto &OMPED = cast<OMPExecutableDirective>(S);
+  const auto &OMPED = S;
   const CapturedStmt *ICS = OMPED.getInnermostCapturedStmt();
   const Stmt *SS = ICS->getCapturedStmt();
   const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(SS);
@@ -2699,7 +2699,7 @@ void CodeGenFunction::EmitOMPLinearClause(
   llvm::DenseSet<const VarDecl *> SIMDLCVs;
   OpenMPDirectiveKind EKind = getEffectiveDirectiveKind(D);
   if (isOpenMPSimdDirective(EKind)) {
-    const auto *LoopDirective = cast<OMPLoopDirective>(&D);
+    const auto *LoopDirective = &D;
     for (const Expr *C : LoopDirective->counters()) {
       SIMDLCVs.insert(
           cast<VarDecl>(cast<DeclRefExpr>(C)->getDecl())->getCanonicalDecl());
diff --git a/clang/lib/CodeGen/CodeGenSYCL.cpp b/clang/lib/CodeGen/CodeGenSYCL.cpp
index 5a52675de299d..d963e4caa4c2e 100644
--- a/clang/lib/CodeGen/CodeGenSYCL.cpp
+++ b/clang/lib/CodeGen/CodeGenSYCL.cpp
@@ -80,6 +80,6 @@ void CodeGenModule::EmitSYCLKernelCaller(const FunctionDecl *KernelEntryPointFn,
                     SourceLocation(), SourceLocation());
   CGF.EmitFunctionBody(OutlinedFnDecl->getBody());
   setDSOLocal(Fn);
-  SetLLVMFunctionAttributesForDefinition(cast<Decl>(OutlinedFnDecl), Fn);
+  SetLLVMFunctionAttributesForDefinition(OutlinedFnDecl, Fn);
   CGF.FinishFunction();
 }
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index e4cb7fc8db6f0..b3a5846c07210 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -1069,7 +1069,7 @@ pointerAuthResignMemberFunctionPointer(llvm::Constant *Src, QualType DestType,
   }
 
   llvm::Constant *ConstPtr = pointerAuthResignConstant(
-      cast<llvm::User>(MemFnPtr)->getOperand(0), CurAuthInfo, NewAuthInfo, CGM);
+      MemFnPtr->getOperand(0), CurAuthInfo, NewAuthInfo, CGM);
   ConstPtr = llvm::ConstantExpr::getPtrToInt(ConstPtr, MemFnPtr->getType());
   return ConstantFoldInsertValueInstruction(Src, ConstPtr, 0);
 }
@@ -3363,7 +3363,7 @@ void ItaniumCXXABI::EmitThreadLocalInitFuncs(
           InitFnTy, Var->getLinkage(), InitFnName.str(), &CGM.getModule());
       const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
       CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI,
-                                    cast<llvm::Function>(Func),
+                                    Func,
                                     /*IsThunk=*/false);
       // Create a function body that just returns
       llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Func);
diff --git a/clang/lib/ExtractAPI/DeclarationFragments.cpp b/clang/lib/ExtractAPI/DeclarationFragments.cpp
index 4eb6f79cb4d85..5ac4a02724057 100644
--- a/clang/lib/ExtractAPI/DeclarationFragments.cpp
+++ b/clang/lib/ExtractAPI/DeclarationFragments.cpp
@@ -1239,7 +1239,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplateSpecialization(
       .append(">", DeclarationFragments::FragmentKind::Text)
       .appendSpace()
       .append(DeclarationFragmentsBuilder::getFragmentsForCXXClass(
-          cast<CXXRecordDecl>(Decl)))
+          Decl))
       .pop_back() // there is an extra semicolon now
       .append("<", DeclarationFragments::FragmentKind::Text)
       .append(getFragmentsForTemplateArguments(
@@ -1262,7 +1262,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplatePartialSpecialization(
       .append(">", DeclarationFragments::FragmentKind::Text)
       .appendSpace()
       .append(DeclarationFragmentsBuilder::getFragmentsForCXXClass(
-          cast<CXXRecordDecl>(Decl)))
+          Decl))
       .pop_back() // there is an extra semicolon now
       .append("<", DeclarationFragments::FragmentKind::Text)
       .append(getFragmentsForTemplateArguments(
diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp
index 2684a00ce5f07..95543fb28d986 100644
--- a/clang/lib/Interpreter/Interpreter.cpp
+++ b/clang/lib/Interpreter/Interpreter.cpp
@@ -72,7 +72,7 @@ GetCC1Arguments(DiagnosticsEngine *Diagnostics,
                                    "Unable to create a driver job");
 
   // The one job we find should be to invoke clang again.
-  const driver::Command *Cmd = cast<driver::Command>(&(*Jobs.begin()));
+  const driver::Command *Cmd = &(*Jobs.begin());
   if (llvm::StringRef(Cmd->getCreator().getName()) != "clang")
     return llvm::createStringError(llvm::errc::not_supported,
                                    "Driver initialization failed");
diff --git a/clang/lib/Interpreter/InterpreterUtils.cpp b/clang/lib/Interpreter/InterpreterUtils.cpp
index 526cd491dbc6d..2829f7d46b92c 100644
--- a/clang/lib/Interpreter/InterpreterUtils.cpp
+++ b/clang/lib/Interpreter/InterpreterUtils.cpp
@@ -82,7 +82,7 @@ NamedDecl *LookupNamed(Sema &S, llvm::StringRef Name,
   else {
     const DeclContext *PrimaryWithin = nullptr;
     if (const auto *TD = dyn_cast<TagDecl>(Within))
-      PrimaryWithin = dyn_cast_if_present<DeclContext>(TD->getDefinition());
+      PrimaryWithin = TD->getDefinition();
     else
       PrimaryWithin = Within->getPrimaryContext();
 
diff --git a/clang/lib/Parse/ParseCXXInlineMethods.cpp b/clang/lib/Parse/ParseCXXInlineMethods.cpp
index bc18881e89110..5922acd977ecb 100644
--- a/clang/lib/Parse/ParseCXXInlineMethods.cpp
+++ b/clang/lib/Parse/ParseCXXInlineMethods.cpp
@@ -451,7 +451,7 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {
       FunctionDecl *Old;
       if (const auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(LM.Method))
         Old =
-            cast<FunctionDecl>(FunTmpl->getTemplatedDecl())->getPreviousDecl();
+            FunTmpl->getTemplatedDecl()->getPreviousDecl();
       else
         Old = cast<FunctionDecl>(LM.Method)->getPreviousDecl();
       if (Old) {
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 37ed7488bb927..374c3eb7819ec 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -2876,7 +2876,7 @@ class CallableVisitor : public DynamicRecursiveASTVisitor {
   }
 
   bool VisitFunctionDecl(FunctionDecl *Node) override {
-    if (cast<DeclContext>(Node)->isDependentContext())
+    if (Node->isDependentContext())
       return true; // Not to analyze dependent decl
     // `FunctionDecl->hasBody()` returns true if the function has a body
     // somewhere defined.  But we want to know if this `Node` has a body
@@ -2887,14 +2887,14 @@ class CallableVisitor : public DynamicRecursiveASTVisitor {
   }
 
   bool VisitBlockDecl(BlockDecl *Node) override {
-    if (cast<DeclContext>(Node)->isDependentContext())
+    if (Node->isDependentContext())
       return true; // Not to analyze dependent decl
     Callback(Node);
     return true;
   }
 
   bool VisitObjCMethodDecl(ObjCMethodDecl *Node) override {
-    if (cast<DeclContext>(Node)->isDependentContext())
+    if (Node->isDependentContext())
       return true; // Not to analyze dependent decl
     if (Node->hasBody())
       Callback(Node);
diff --git a/clang/lib/Sema/ScopeInfo.cpp b/clang/lib/Sema/ScopeInfo.cpp
index d089836fa36dd..236d9721e2dcc 100644
--- a/clang/lib/Sema/ScopeInfo.cpp
+++ b/clang/lib/Sema/ScopeInfo.cpp
@@ -238,7 +238,7 @@ void LambdaScopeInfo::visitPotentialCaptures(
     if (auto *DRE = dyn_cast<DeclRefExpr>(E)) {
       Callback(cast<ValueDecl>(DRE->getFoundDecl()), E);
     } else if (auto *ME = dyn_cast<MemberExpr>(E)) {
-      Callback(cast<ValueDecl>(ME->getMemberDecl()), E);
+      Callback(ME->getMemberDecl(), E);
     } else if (auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
       for (ValueDecl *VD : *FP)
         Callback(VD, E);
diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp
index 41b2d0b5b5b34..d664c1398ce45 100644
--- a/clang/lib/Sema/SemaAvailability.cpp
+++ b/clang/lib/Sema/SemaAvailability.cpp
@@ -551,7 +551,7 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K,
   case AR_Deprecated:
     // Suppress -Wdeprecated-declarations in implicit
     // functions.
-    if (const auto *FD = dyn_cast_or_null<FunctionDecl>(S.getCurFunctionDecl());
+    if (const auto *FD = S.getCurFunctionDecl();
         FD && FD->isImplicit())
       return;
 
diff --git a/clang/lib/Sema/SemaBoundsSafety.cpp b/clang/lib/Sema/SemaBoundsSafety.cpp
index 8c8e37d321938..2dc2132158222 100644
--- a/clang/lib/Sema/SemaBoundsSafety.cpp
+++ b/clang/lib/Sema/SemaBoundsSafety.cpp
@@ -366,7 +366,7 @@ bool Sema::BoundsSafetyCheckInitialization(const InitializedEntity &Entity,
 
     if (!CheckAssignmentToCountAttrPtrWithIncompletePointeeTy(
             *this, LHSType, RHSExpr, Action, SL,
-            dyn_cast_or_null<ValueDecl>(Entity.getDecl()),
+            Entity.getDecl(),
             /*ShowFullQualifiedAssigneeName=*/true)) {
       return false;
     }
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 0cd9819dc2964..5c72e94398309 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -7199,7 +7199,7 @@ void SemaCodeCompletion::CodeCompleteConstructorInitializer(
           QualType(Initializers[I]->getBaseClass(), 0)));
     else
       InitializedFields.insert(
-          cast<FieldDecl>(Initializers[I]->getAnyMember()));
+          Initializers[I]->getAnyMember());
   }
 
   // Add completions for base classes.
@@ -7307,7 +7307,7 @@ void SemaCodeCompletion::CodeCompleteConstructorInitializer(
 
   // Add completions for members.
   for (auto *Field : ClassDecl->fields()) {
-    if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))
+    if (!InitializedFields.insert(Field->getCanonicalDecl())
              .second) {
       SawLastInitializer = !Initializers.empty() &&
                            Initializers.back()->isAnyMemberInitializer() &&
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index 5cd2c3d326ff7..195bbf2f66528 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -1600,7 +1600,7 @@ static const Expr *SubstituteConstraintExpressionWithoutSatisfaction(
   }();
   if (auto *RD = dyn_cast<CXXRecordDecl>(DC)) {
     ThisScope.emplace(S, const_cast<CXXRecordDecl *>(RD), Qualifiers());
-    ContextScope.emplace(S, const_cast<DeclContext *>(cast<DeclContext>(RD)),
+    ContextScope.emplace(S, const_cast<CXXRecordDecl *>(RD),
                          /*NewThisContext=*/false);
   }
   EnterExpressionEvaluationContext UnevaluatedContext(
diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp
index 07bb6e2161cc7..60a41f8c79ee1 100644
--- a/clang/lib/Sema/SemaCoroutine.cpp
+++ b/clang/lib/Sema/SemaCoroutine.cpp
@@ -728,7 +728,7 @@ bool Sema::ActOnCoroutineBodyStart(Scope *SC, SourceLocation KWLoc,
       Diag(KWLoc, diag::note_declared_coroutine_here) << Keyword;
       return StmtError();
     }
-    return cast<Stmt>(Suspend.get());
+    return Suspend.get();
   };
 
   StmtResult InitSuspend = buildSuspends("initial_suspend");
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 9fd8c6a0a5451..4bd5271c0ce5f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -3507,7 +3507,7 @@ ExprResult Sema::BuildDeclarationNameExpr(
     // potentially-evaluated contexts? Since the variable isn't actually
     // captured in an unevaluated context, it seems that the answer is no.
     if (!isUnevaluatedContext()) {
-      QualType CapturedType = getCapturedDeclRefType(cast<ValueDecl>(VD), Loc);
+      QualType CapturedType = getCapturedDeclRefType(VD, Loc);
       if (!CapturedType.isNull())
         type = CapturedType;
     }
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 39c5e3b0671bb..d893823053861 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -4782,7 +4782,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
     if (SCS.Second == ICK_Derived_To_Base) {
       SmallVector<Expr*, 8> ConstructorArgs;
       if (CompleteConstructorCall(
-              cast<CXXConstructorDecl>(SCS.CopyConstructor), ToType, From,
+              SCS.CopyConstructor, ToType, From,
               /*FIXME:ConstructLoc*/ SourceLocation(), ConstructorArgs))
         return ExprError();
       return BuildCXXConstructExpr(
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index e54a25405c816..7f7236d6e37e2 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -10310,7 +10310,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
         Pattern = Pattern->getInstantiatedFromMemberTemplate();
       }
 
-      auto *RD = cast<CXXRecordDecl>(Pattern->getTemplatedDecl());
+      auto *RD = Pattern->getTemplatedDecl();
       if (!(RD->getDefinition() && RD->isAggregate()))
         return;
       QualType Ty = Context.getCanonicalTagType(RD);
@@ -10452,7 +10452,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
 
   case OR_No_Viable_Function: {
     CXXRecordDecl *Primary =
-        cast<ClassTemplateDecl>(Template)->getTemplatedDecl();
+        Template->getTemplatedDecl();
     bool Complete = isCompleteType(Kind.getLocation(),
                                    Context.getCanonicalTagType(Primary));
     Candidates.NoteCandidates(
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 73cbc7a428661..09d4000e411d2 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -7830,7 +7830,7 @@ SemaOpenMP::checkOpenMPDeclareVariantFunction(SemaOpenMP::DeclGroupPtrTy DG,
           /*TemplatesSupported=*/true, /*ConstexprSupported=*/false,
           /*CLinkageMayDiffer=*/true))
     return std::nullopt;
-  return std::make_pair(FD, cast<Expr>(DRE));
+  return std::make_pair(FD, DRE);
 }
 
 void SemaOpenMP::ActOnOpenMPDeclareVariantDirective(
@@ -23010,7 +23010,7 @@ static ExprResult buildImplicitMapper(Sema &S, QualType BaseType,
     S.PushOnScopeChains(DMD, Scope, /*AddToContext=*/false);
   DCT->addDecl(DMD);
   DMD->setAccess(clang::AS_none);
-  auto *VD = cast<DeclRefExpr>(MapperVarRef)->getDecl();
+  auto *VD = MapperVarRef->getDecl();
   VD->setDeclContext(DMD);
   VD->setLexicalDeclContext(DMD);
   DMD->addDecl(VD);
@@ -25508,7 +25508,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPUsesAllocatorClause(
              diag::err_omp_predefined_allocator_with_traits)
             << D.AllocatorTraits->getSourceRange();
         Diag(D.Allocator->getExprLoc(), diag::note_omp_predefined_allocator)
-            << cast<NamedDecl>(DRE->getDecl())->getName()
+            << DRE->getDecl()->getName()
             << D.Allocator->getSourceRange();
         continue;
       }
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 11e771bc240f1..4a7fd34ad7750 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -13890,7 +13890,7 @@ class AddressOfFunctionResolver {
       if (!S.getLangOpts().CPlusPlus ||
           candidateHasExactlyCorrectType(FunDecl)) {
         Matches.push_back(std::make_pair(
-            CurAccessFunPair, cast<FunctionDecl>(FunDecl->getCanonicalDecl())));
+            CurAccessFunPair, FunDecl->getCanonicalDecl()));
         FoundNonTemplateFunction = true;
         return true;
       }
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index c436b7018a2bd..4b219614cc6c3 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -1169,7 +1169,7 @@ bool Sema::BuildTypeConstraint(const CXXScopeSpec &SS,
     return true;
 
   TemplateName TN = TypeConstr->Template.get();
-  TemplateDecl *CD = cast<TemplateDecl>(TN.getAsTemplateDecl());
+  TemplateDecl *CD = TN.getAsTemplateDecl();
   UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
 
   DeclarationNameInfo ConceptName(DeclarationName(TypeConstr->Name),
@@ -5811,7 +5811,7 @@ static bool diagnoseMissingArgument(Sema &S, SourceLocation Loc,
   // missing a module import.
   llvm::SmallVector<Module*, 8> Modules;
   if (D->hasDefaultArgument() && !S.hasReachableDefaultArgument(D, &Modules)) {
-    S.diagnoseMissingImport(Loc, cast<NamedDecl>(TD),
+    S.diagnoseMissingImport(Loc, TD,
                             D->getDefaultArgumentLoc(), Modules,
                             Sema::MissingImportKind::DefaultArgument,
                             /*Recover*/true);
@@ -10166,7 +10166,7 @@ static bool ScopeSpecifierHasTemplateId(const CXXScopeSpec &SS) {
 /// effect.
 static void dllExportImportClassTemplateSpecialization(
     Sema &S, ClassTemplateSpecializationDecl *Def) {
-  auto *A = cast_or_null<InheritableAttr>(getDLLAttr(Def));
+  auto *A = getDLLAttr(Def);
   assert(A && "dllExportImportClassTemplateSpecialization called "
               "on Def without dllexport or dllimport");
 
@@ -10556,7 +10556,7 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc,
 
   // Verify that it is okay to explicitly instantiate here.
   CXXRecordDecl *PrevDecl
-    = cast_or_null<CXXRecordDecl>(Record->getPreviousDecl());
+    = Record->getPreviousDecl();
   if (!PrevDecl && Record->getDefinition())
     PrevDecl = Record;
   if (PrevDecl) {
@@ -10574,13 +10574,13 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc,
   }
 
   CXXRecordDecl *RecordDef
-    = cast_or_null<CXXRecordDecl>(Record->getDefinition());
+    = Record->getDefinition();
   if (!RecordDef) {
     // C++ [temp.explicit]p3:
     //   A definition of a member class of a class template shall be in scope
     //   at the point of an explicit instantiation of the member class.
     CXXRecordDecl *Def
-      = cast_or_null<CXXRecordDecl>(Pattern->getDefinition());
+      = Pattern->getDefinition();
     if (!Def) {
       Diag(TemplateLoc, diag::err_explicit_instantiation_undefined_member)
         << 0 << Record->getDeclName() << Record->getDeclContext();
@@ -10593,7 +10593,7 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc,
                            TSK))
         return true;
 
-      RecordDef = cast_or_null<CXXRecordDecl>(Record->getDefinition());
+      RecordDef = Record->getDefinition();
       if (!RecordDef)
         return true;
     }
@@ -10923,7 +10923,7 @@ DeclResult Sema::ActOnExplicitInstantiation(Scope *S,
                                                   Best)) {
     case OR_Success:
     case OR_Deleted:
-      Specialization = cast<FunctionDecl>(Best->Function);
+      Specialization = Best->Function;
       break;
     case OR_Ambiguous:
       Msg = diag::err_explicit_instantiation_ambiguous;
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp
index 5381a5a6f110d..e5d848475d675 100644
--- a/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -3522,7 +3522,7 @@ bool Sema::InstantiateClassImpl(
     TemplateSpecializationKind TSK, bool Complain) {
 
   CXXRecordDecl *PatternDef
-    = cast_or_null<CXXRecordDecl>(Pattern->getDefinition());
+    = Pattern->getDefinition();
   if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation,
                                 Instantiation->getInstantiatedFromMemberClass(),
                                      Pattern, PatternDef, TSK, Complain))
@@ -4309,7 +4309,7 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
         }
       }
 
-      Pattern = cast_or_null<CXXRecordDecl>(Record->getDefinition());
+      Pattern = Record->getDefinition();
       if (Pattern)
         InstantiateClassMembers(PointOfInstantiation, Pattern, TemplateArgs,
                                 TSK);
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 09c2482168ab7..c748c4f239787 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -3943,8 +3943,8 @@ Decl *TemplateDeclInstantiator::VisitBaseUsingDecls(BaseUsingDecl *D,
       InstTarget = UnresolvedUsingIfExistsDecl::Create(
           SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
     } else {
-      InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
-          Shadow->getLocation(), OldTarget, TemplateArgs));
+      InstTarget = SemaRef.FindInstantiatedDecl(
+          Shadow->getLocation(), OldTarget, TemplateArgs);
     }
     if (!InstTarget)
       return nullptr;
@@ -6937,8 +6937,7 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
         assert(ArgPackSubstIndex &&
                "found declaration pack but not pack expanding");
         typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
-        return cast<NamedDecl>(
-            (*cast<DeclArgumentPack *>(*Found))[*ArgPackSubstIndex]);
+        return (*cast<DeclArgumentPack *>(*Found))[*ArgPackSubstIndex];
       }
     }
 
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 846474fe94adf..b60fe924f1f38 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1325,7 +1325,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
     if (DS.isConstrainedAuto()) {
       if (TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId()) {
         TypeConstraintConcept =
-            cast<TemplateDecl>(TemplateId->Template.get().getAsTemplateDecl());
+            TemplateId->Template.get().getAsTemplateDecl();
         TemplateArgumentListInfo TemplateArgsInfo;
         TemplateArgsInfo.setLAngleLoc(TemplateId->LAngleLoc);
         TemplateArgsInfo.setRAngleLoc(TemplateId->RAngleLoc);
@@ -6139,9 +6139,9 @@ namespace {
       NamedDecl *FoundDecl;
       if (auto TN = TemplateId->Template.get();
           UsingShadowDecl *USD = TN.getAsUsingShadowDecl())
-        FoundDecl = cast<NamedDecl>(USD);
+        FoundDecl = USD;
       else
-        FoundDecl = cast_if_present<NamedDecl>(TN.getAsTemplateDecl());
+        FoundDecl = TN.getAsTemplateDecl();
 
       auto *CR = ConceptReference::Create(
           Context, NNS, TemplateId->TemplateKWLoc, DNI, FoundDecl,
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index b328114ef240f..9777786c36a5b 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -10,6 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "clang/Serialization/ASTReader.h"
 #include "ASTCommon.h"
 #include "ASTReaderInternals.h"
 #include "TemplateArgumentHasher.h"
@@ -9674,7 +9675,7 @@ void ASTReader::ReadUnusedLocalTypedefNameCandidates(
 void ASTReader::ReadDeclsToCheckForDeferredDiags(
     llvm::SmallSetVector<Decl *, 4> &Decls) {
   for (auto I : DeclsToCheckForDeferredDiags) {
-    auto *D = dyn_cast_or_null<Decl>(GetDecl(I));
+    auto *D = GetDecl(I);
     if (D)
       Decls.insert(D);
   }
@@ -11268,9 +11269,9 @@ void ASTReader::FinishedDeserializing() {
           auto *FPT = Update.second->getType()->castAs<FunctionProtoType>();
           auto ESI = FPT->getExtProtoInfo().ExceptionSpec;
           if (auto *Listener = getContext().getASTMutationListener())
-            Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second));
+            Listener->ResolvedExceptionSpec(Update.second);
           for (auto *Redecl : Update.second->redecls())
-            getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI);
+            getContext().adjustExceptionSpec(Redecl, ESI);
         }
 
         auto DTUpdates = std::move(PendingDeducedTypeUpdates);
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 9033ea55bc5e2..d48fb06fdc4e6 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1817,7 +1817,7 @@ void ASTDeclReader::VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D) {
   for (unsigned I = 0; I < D->NumParams; ++I)
     D->setParam(I, readDeclAs<ImplicitParamDecl>());
   D->setNothrow(Record.readInt() != 0);
-  D->setBody(cast_or_null<Stmt>(Record.readStmt()));
+  D->setBody(Record.readStmt());
 }
 
 void ASTDeclReader::VisitCapturedDecl(CapturedDecl *CD) {
@@ -2342,7 +2342,7 @@ void ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
   VisitCXXMethodDecl(D);
 
   ASTContext &C = Reader.getContext();
-  CXXDestructorDecl *Canon = cast<CXXDestructorDecl>(D->getCanonicalDecl());
+  CXXDestructorDecl *Canon = D->getCanonicalDecl();
   if (auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
     auto *ThisArg = Record.readExpr();
     // FIXME: Check consistency if we have an old and new operator delete.
@@ -3615,7 +3615,7 @@ void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous) {
   const auto *IA = Previous->getAttr<MSInheritanceAttr>();
 
   if (IA && !D->hasAttr<MSInheritanceAttr>()) {
-    NewAttr = cast<InheritableAttr>(IA->clone(Context));
+    NewAttr = IA->clone(Context);
     NewAttr->setInherited(true);
     D->addAttr(NewAttr);
   }
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 801eed43c2440..705d3bda06aed 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -547,7 +547,7 @@ void ASTStmtReader::VisitCXXReflectExpr(CXXReflectExpr *E) {
 void ASTStmtReader::VisitSYCLKernelCallStmt(SYCLKernelCallStmt *S) {
   VisitStmt(S);
   S->setOriginalStmt(cast<CompoundStmt>(Record.readSubStmt()));
-  S->setKernelLaunchStmt(cast<Stmt>(Record.readSubStmt()));
+  S->setKernelLaunchStmt(Record.readSubStmt());
   S->setOutlinedFunctionDecl(readDeclAs<OutlinedFunctionDecl>());
 }
 
diff --git a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
index ee65e34fee820..721a08a738d18 100644
--- a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
@@ -247,7 +247,7 @@ void IvarInvalidationCheckerImpl::containsInvalidationMethod(
   for (const auto *MDI : D->methods())
     if (isInvalidationMethod(MDI, Partial))
       OutInfo.addInvalidationMethod(
-          cast<ObjCMethodDecl>(MDI->getCanonicalDecl()));
+          MDI->getCanonicalDecl());
 
   // If interface, check all parent protocols and super.
   if (const ObjCInterfaceDecl *InterfD = dyn_cast<ObjCInterfaceDecl>(D)) {
@@ -286,7 +286,7 @@ bool IvarInvalidationCheckerImpl::trackIvar(const ObjCIvarDecl *Iv,
   InvalidationInfo Info;
   containsInvalidationMethod(IvInterf, Info, /*LookForPartial*/ false);
   if (Info.needsInvalidation()) {
-    const ObjCIvarDecl *I = cast<ObjCIvarDecl>(Iv->getCanonicalDecl());
+    const ObjCIvarDecl *I = Iv->getCanonicalDecl();
     TrackedIvars[I] = std::move(Info);
     if (!*FirstIvarDecl)
       *FirstIvarDecl = I;
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
index 1f6d633dc7ce6..e26d0cff0d40d 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
@@ -3140,7 +3140,7 @@ static bool isSmartPtrType(QualType QT) {
     if (!TD)
       return false;
 
-    const auto *ND = dyn_cast_or_null<NamedDecl>(TD->getTemplatedDecl());
+    const auto *ND = TD->getTemplatedDecl();
     if (!ND)
       return false;
 
diff --git a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
index ba8281b186c5d..f25fb54e77d1e 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
@@ -581,7 +581,7 @@ void MoveChecker::explainObject(ProgramStateRef State, llvm::raw_ostream &OS,
   // and we never know if we are to explain anything until we try.
   if (const auto DR =
           dyn_cast_or_null<DeclRegion>(unwrapRValueReferenceIndirection(MR))) {
-    const auto *RegionDecl = cast<NamedDecl>(DR->getDecl());
+    const auto *RegionDecl = DR->getDecl();
     OS << " '" << RegionDecl->getDeclName() << "'";
   }
 
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index 7df5fab0843ac..34de32f3e1e97 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -2433,7 +2433,7 @@ class InlinedFunctionCallHandler final : public ExpressionHandler {
     SVal RetVal = ExprNode->getSVal(E);
 
     // Handle cases where a reference is returned and then immediately used.
-    if (cast<Expr>(E)->isGLValue())
+    if (E->isGLValue())
       if (std::optional<Loc> LValue = RetVal.getAs<Loc>())
         RetVal = State->getSVal(*LValue);
 
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
index 67beed5dbb6fb..0262ee7b1c0ac 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
@@ -973,7 +973,7 @@ void ExprEngine::VisitUnaryOperator(const UnaryOperator* U, ExplodedNode *Pred,
         if (isa<CXXMethodDecl, FieldDecl, IndirectFieldDecl>(VD)) {
           ProgramStateRef State = N->getState();
           const LocationContext *LCtx = N->getLocationContext();
-          SVal SV = svalBuilder.getMemberPointer(cast<NamedDecl>(VD));
+          SVal SV = svalBuilder.getMemberPointer(VD);
           Bldr.generateNode(U, N, State->BindExpr(U, LCtx, SV));
           break;
         }
diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
index 5544d254929e5..ab66c342aedc7 100644
--- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
+++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp
@@ -1012,7 +1012,7 @@ getStackOrCaptureRegionForDeclContext(const LocationContext *LC,
         const TypedValueRegion *OrigR = Var.getOriginalRegion();
         if (const auto *VR = dyn_cast<VarRegion>(OrigR)) {
           if (VR->getDecl() == VD)
-            return cast<VarRegion>(Var.getCapturedRegion());
+            return Var.getCapturedRegion();
         }
       }
     }
diff --git a/clang/lib/Tooling/Refactoring/Lookup.cpp b/clang/lib/Tooling/Refactoring/Lookup.cpp
index dedde860516ab..3da9252cfc895 100644
--- a/clang/lib/Tooling/Refactoring/Lookup.cpp
+++ b/clang/lib/Tooling/Refactoring/Lookup.cpp
@@ -74,8 +74,8 @@ usingFromDifferentCanonicalNamespace(const DeclContext *FromContext,
       return false;
     // Now check the names. If they match we have a different canonical
     // namespace with the same name.
-    if (cast<NamespaceDecl>(*FromIter)->getDeclName() ==
-        cast<NamespaceDecl>(*UseIter)->getDeclName())
+    if ((*FromIter)->getDeclName() ==
+        (*UseIter)->getDeclName())
       return true;
   }
   assert(FromIter == FromNamespaces.end() && UseIter == UseNamespaces.end());

>From 0ac673d5a8bcec4ffd6c351bd33ac3a74f1f69ff Mon Sep 17 00:00:00 2001
From: "Henrik G. Olsson" <h_olsson at apple.com>
Date: Thu, 9 Apr 2026 16:26:45 -0700
Subject: [PATCH 2/6] clang format

---
 clang/lib/AST/ASTImporter.cpp                     |  3 ++-
 clang/lib/AST/ASTStructuralEquivalence.cpp        |  3 +--
 clang/lib/AST/CXXInheritance.cpp                  |  3 +--
 clang/lib/AST/ComputeDependence.cpp               |  3 +--
 clang/lib/AST/DeclCXX.cpp                         | 15 +++++----------
 clang/lib/AST/DeclObjC.cpp                        |  6 ++----
 clang/lib/AST/ItaniumMangle.cpp                   |  4 +---
 clang/lib/Analysis/ThreadSafetyCommon.cpp         |  3 +--
 clang/lib/CodeGen/CGDebugInfo.cpp                 |  3 +--
 clang/lib/CodeGen/CGObjCGNU.cpp                   |  3 ++-
 clang/lib/CodeGen/CGOpenMPRuntime.cpp             |  9 +++------
 clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp          |  5 ++---
 clang/lib/CodeGen/ItaniumCXXABI.cpp               |  3 +--
 clang/lib/ExtractAPI/DeclarationFragments.cpp     |  6 ++----
 clang/lib/Parse/ParseCXXInlineMethods.cpp         |  3 +--
 clang/lib/Sema/SemaAvailability.cpp               |  3 +--
 clang/lib/Sema/SemaBoundsSafety.cpp               |  3 +--
 clang/lib/Sema/SemaCodeComplete.cpp               |  6 ++----
 clang/lib/Sema/SemaExprCXX.cpp                    |  6 +++---
 clang/lib/Sema/SemaInit.cpp                       |  3 +--
 clang/lib/Sema/SemaOpenMP.cpp                     |  3 +--
 clang/lib/Sema/SemaOverload.cpp                   |  4 ++--
 clang/lib/Sema/SemaTemplate.cpp                   | 14 +++++---------
 clang/lib/Sema/SemaTemplateInstantiate.cpp        |  3 +--
 clang/lib/Sema/SemaTemplateInstantiateDecl.cpp    |  4 ++--
 clang/lib/Sema/SemaType.cpp                       |  3 +--
 .../Checkers/IvarInvalidationChecker.cpp          |  3 +--
 clang/lib/Tooling/Refactoring/Lookup.cpp          |  3 +--
 28 files changed, 48 insertions(+), 82 deletions(-)

diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index c4c1456da9193..e507ed5ba4894 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -9364,7 +9364,8 @@ Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
   Error ImportErrors = Error::success();
   for (auto *FromOverriddenMethod : FromMethod->overridden_methods()) {
     if (auto ImportedOrErr = import(FromOverriddenMethod))
-      ToMethod->getCanonicalDecl()->addOverriddenMethod((*ImportedOrErr)->getCanonicalDecl());
+      ToMethod->getCanonicalDecl()->addOverriddenMethod(
+          (*ImportedOrErr)->getCanonicalDecl());
     else
       ImportErrors =
           joinErrors(std::move(ImportErrors), ImportedOrErr.takeError());
diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp
index c3fd0545d4adb..50a7790c6353e 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -2464,8 +2464,7 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   if (D1->getAccessControl() != D2->getAccessControl())
     return false;
 
-  return IsStructurallyEquivalent(Context, D1,
-                                  D2, Owner2Type);
+  return IsStructurallyEquivalent(Context, D1, D2, Owner2Type);
 }
 
 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
diff --git a/clang/lib/AST/CXXInheritance.cpp b/clang/lib/AST/CXXInheritance.cpp
index 90fd48ff68763..dc1be286455e3 100644
--- a/clang/lib/AST/CXXInheritance.cpp
+++ b/clang/lib/AST/CXXInheritance.cpp
@@ -452,8 +452,7 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD,
                                       CXXFinalOverriderMap &Overriders) {
   unsigned SubobjectNumber = 0;
   if (!VirtualBase)
-    SubobjectNumber
-      = ++SubobjectCount[RD->getCanonicalDecl()];
+    SubobjectNumber = ++SubobjectCount[RD->getCanonicalDecl()];
 
   for (const auto &Base : RD->bases()) {
     if (const auto *BaseDecl = Base.getType()->getAsCXXRecordDecl()) {
diff --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp
index 6cb60eb928350..0c50d4fe5c73b 100644
--- a/clang/lib/AST/ComputeDependence.cpp
+++ b/clang/lib/AST/ComputeDependence.cpp
@@ -153,8 +153,7 @@ ExprDependence clang::computeDependence(ExplicitCastExpr *E) {
   // because when the type as written is a deduced type, that type is not
   // dependent, but it may be deduced as a dependent type.
   ExprDependence D =
-      toExprDependenceAsWritten(
-          E->getTypeAsWritten()->getDependence()) |
+      toExprDependenceAsWritten(E->getTypeAsWritten()->getDependence()) |
       toExprDependenceForImpliedType(E->getType()->getDependence());
   if (auto *S = E->getSubExpr())
     D |= S->getDependence() & ~ExprDependence::Type;
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 8fad1e2c6edae..8d78894cceec2 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -1778,8 +1778,7 @@ CXXMethodDecl *CXXRecordDecl::getLambdaStaticInvoker(CallingConv CC) const {
   DeclContext::lookup_result Invoker = getLambdaStaticInvokers(*this);
 
   for (NamedDecl *ND : Invoker) {
-    const auto *FTy =
-        ND->getAsFunction()->getType()->castAs<FunctionType>();
+    const auto *FTy = ND->getAsFunction()->getType()->castAs<FunctionType>();
     if (FTy->getCallConv() == CC)
       return getInvokerAsMethod(ND);
   }
@@ -3169,8 +3168,7 @@ void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
         this, OD, ASTContext::OperatorDeleteKind::Regular);
     getCanonicalDecl()->OperatorDeleteThisArg = ThisArg;
     if (auto *L = getASTMutationListener())
-      L->ResolvedOperatorDelete(getCanonicalDecl(), OD,
-                                ThisArg);
+      L->ResolvedOperatorDelete(getCanonicalDecl(), OD, ThisArg);
   }
 }
 
@@ -3187,8 +3185,7 @@ void CXXDestructorDecl::setOperatorGlobalDelete(FunctionDecl *OD) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::GlobalRegular);
     if (auto *L = getASTMutationListener())
-      L->ResolvedOperatorGlobDelete(getCanonicalDecl(),
-                                    OD);
+      L->ResolvedOperatorGlobDelete(getCanonicalDecl(), OD);
   }
 }
 
@@ -3200,8 +3197,7 @@ void CXXDestructorDecl::setOperatorArrayDelete(FunctionDecl *OD) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::Array);
     if (auto *L = getASTMutationListener())
-      L->ResolvedOperatorArrayDelete(
-          getCanonicalDecl(), OD);
+      L->ResolvedOperatorArrayDelete(getCanonicalDecl(), OD);
   }
 }
 
@@ -3214,8 +3210,7 @@ void CXXDestructorDecl::setGlobalOperatorArrayDelete(FunctionDecl *OD) {
     getASTContext().addOperatorDeleteForVDtor(
         this, OD, ASTContext::OperatorDeleteKind::ArrayGlobal);
     if (auto *L = getASTMutationListener())
-      L->ResolvedOperatorGlobArrayDelete(
-          getCanonicalDecl(), OD);
+      L->ResolvedOperatorGlobArrayDelete(getCanonicalDecl(), OD);
   }
 }
 
diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp
index f67da713cfd76..fc4c7ea70cf71 100644
--- a/clang/lib/AST/DeclObjC.cpp
+++ b/clang/lib/AST/DeclObjC.cpp
@@ -264,8 +264,7 @@ ObjCPropertyDecl *ObjCContainerDecl::FindPropertyDeclaration(
   }
 
   if (ObjCPropertyDecl *PD =
-        ObjCPropertyDecl::findPropertyDecl(this, PropertyId,
-                                           QueryKind))
+          ObjCPropertyDecl::findPropertyDecl(this, PropertyId, QueryKind))
     return PD;
 
   switch (getKind()) {
@@ -386,8 +385,7 @@ ObjCPropertyDecl *ObjCInterfaceDecl::FindPropertyVisibleInPrimaryClass(
     LoadExternalDefinition();
 
   if (ObjCPropertyDecl *PD =
-      ObjCPropertyDecl::findPropertyDecl(this, PropertyId,
-                                         QueryKind))
+          ObjCPropertyDecl::findPropertyDecl(this, PropertyId, QueryKind))
     return PD;
 
   // Look through protocols.
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 9ffe31c71e919..949074a39aa13 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -4654,9 +4654,7 @@ void CXXNameMangler::mangleType(const DependentBitIntType *T) {
   Out << "_";
 }
 
-void CXXNameMangler::mangleType(const ArrayParameterType *T) {
-  mangleType(T);
-}
+void CXXNameMangler::mangleType(const ArrayParameterType *T) { mangleType(T); }
 
 void CXXNameMangler::mangleType(const HLSLAttributedResourceType *T) {
   llvm::SmallString<64> Str("_Res");
diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp
index 685a3ad87ec8e..83c337e769042 100644
--- a/clang/lib/Analysis/ThreadSafetyCommon.cpp
+++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp
@@ -526,8 +526,7 @@ til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
       // return E;
     }
   }
-  return translateCallExpr(ME, Ctx,
-                           ME->getImplicitObjectArgument());
+  return translateCallExpr(ME, Ctx, ME->getImplicitObjectArgument());
 }
 
 til::SExpr *SExprBuilder::translateCXXOperatorCallExpr(
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index fc48a238648dd..ad0fdd8646c56 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4663,8 +4663,7 @@ CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
       DContext, Name, LinkageName, Unit, Line, getOrCreateType(T, Unit),
       !VD->isExternallyVisible(), nullptr, TemplateParameters, Align);
   FwdDeclReplaceMap.emplace_back(
-      std::piecewise_construct,
-      std::make_tuple(VD->getCanonicalDecl()),
+      std::piecewise_construct, std::make_tuple(VD->getCanonicalDecl()),
       std::make_tuple(static_cast<llvm::Metadata *>(GV)));
   return GV;
 }
diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp
index 28a92e8c74e33..15d14dc96088c 100644
--- a/clang/lib/CodeGen/CGObjCGNU.cpp
+++ b/clang/lib/CodeGen/CGObjCGNU.cpp
@@ -1990,7 +1990,8 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
       // we can't import a class struct.
       if (OID->getClassInterface()->hasAttr<DLLExportAttr>()) {
         classStruct->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
-        classRefSymbol->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
+        classRefSymbol->setDLLStorageClass(
+            llvm::GlobalValue::DLLExportStorageClass);
       }
 
       if (SuperClass) {
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index ae40b838c04e4..639260c31d836 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -11274,8 +11274,7 @@ bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
   // the normal code generation.
   if (!CGM.getLangOpts().OpenMPIsTargetDevice) {
     if (const auto *FD = dyn_cast<FunctionDecl>(GD.getDecl()))
-      if (isAssumedToBeNotEmitted(FD,
-                                  CGM.getLangOpts().OpenMPIsTargetDevice))
+      if (isAssumedToBeNotEmitted(FD, CGM.getLangOpts().OpenMPIsTargetDevice))
         return true;
     return false;
   }
@@ -11285,8 +11284,7 @@ bool CGOpenMPRuntime::emitTargetFunctions(GlobalDecl GD) {
   if (const auto *FD = dyn_cast<FunctionDecl>(VD)) {
     StringRef Name = CGM.getMangledName(GD);
     scanForTargetRegionsFunctions(FD->getBody(), Name);
-    if (isAssumedToBeNotEmitted(FD,
-                                CGM.getLangOpts().OpenMPIsTargetDevice))
+    if (isAssumedToBeNotEmitted(FD, CGM.getLangOpts().OpenMPIsTargetDevice))
       return true;
   }
 
@@ -12884,8 +12882,7 @@ void CGOpenMPRuntime::emitLastprivateConditionalUpdate(CodeGenFunction &CGF,
   // decltype(priv_a) last_a;
   llvm::GlobalVariable *Last = OMPBuilder.getOrCreateInternalVariable(
       CGF.ConvertTypeForMem(LVal.getType()), UniqueDeclName);
-  Last->setAlignment(
-      LVal.getAlignment().getAsAlign());
+  Last->setAlignment(LVal.getAlignment().getAsAlign());
   LValue LastLVal =
       CGF.MakeRawAddrLValue(Last, LVal.getType(), LVal.getAlignment());
 
diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
index 9909584a6f60f..48f57a6cfdda9 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
@@ -946,9 +946,8 @@ llvm::Function *CGOpenMPRuntimeGPU::emitParallelOutlinedFunction(
   // Emit target region as a standalone region.
   bool PrevIsInTTDRegion = IsInTTDRegion;
   IsInTTDRegion = false;
-  auto *OutlinedFun =
-      CGOpenMPRuntime::emitParallelOutlinedFunction(
-          CGF, D, ThreadIDVar, InnermostKind, CodeGen);
+  auto *OutlinedFun = CGOpenMPRuntime::emitParallelOutlinedFunction(
+      CGF, D, ThreadIDVar, InnermostKind, CodeGen);
   IsInTTDRegion = PrevIsInTTDRegion;
   if (getExecutionMode() != CGOpenMPRuntimeGPU::EM_SPMD) {
     llvm::Function *WrapperFun =
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index b3a5846c07210..35150ad45d7f4 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -3362,8 +3362,7 @@ void ItaniumCXXABI::EmitThreadLocalInitFuncs(
       llvm::Function *Func = llvm::Function::Create(
           InitFnTy, Var->getLinkage(), InitFnName.str(), &CGM.getModule());
       const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
-      CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI,
-                                    Func,
+      CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Func,
                                     /*IsThunk=*/false);
       // Create a function body that just returns
       llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Func);
diff --git a/clang/lib/ExtractAPI/DeclarationFragments.cpp b/clang/lib/ExtractAPI/DeclarationFragments.cpp
index 5ac4a02724057..28721f7b26b58 100644
--- a/clang/lib/ExtractAPI/DeclarationFragments.cpp
+++ b/clang/lib/ExtractAPI/DeclarationFragments.cpp
@@ -1238,8 +1238,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplateSpecialization(
       .append("<", DeclarationFragments::FragmentKind::Text)
       .append(">", DeclarationFragments::FragmentKind::Text)
       .appendSpace()
-      .append(DeclarationFragmentsBuilder::getFragmentsForCXXClass(
-          Decl))
+      .append(DeclarationFragmentsBuilder::getFragmentsForCXXClass(Decl))
       .pop_back() // there is an extra semicolon now
       .append("<", DeclarationFragments::FragmentKind::Text)
       .append(getFragmentsForTemplateArguments(
@@ -1261,8 +1260,7 @@ DeclarationFragmentsBuilder::getFragmentsForClassTemplatePartialSpecialization(
           Decl->getTemplateParameters()->asArray()))
       .append(">", DeclarationFragments::FragmentKind::Text)
       .appendSpace()
-      .append(DeclarationFragmentsBuilder::getFragmentsForCXXClass(
-          Decl))
+      .append(DeclarationFragmentsBuilder::getFragmentsForCXXClass(Decl))
       .pop_back() // there is an extra semicolon now
       .append("<", DeclarationFragments::FragmentKind::Text)
       .append(getFragmentsForTemplateArguments(
diff --git a/clang/lib/Parse/ParseCXXInlineMethods.cpp b/clang/lib/Parse/ParseCXXInlineMethods.cpp
index 5922acd977ecb..8b8cdfcfdc77f 100644
--- a/clang/lib/Parse/ParseCXXInlineMethods.cpp
+++ b/clang/lib/Parse/ParseCXXInlineMethods.cpp
@@ -450,8 +450,7 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {
       assert(Param->hasInheritedDefaultArg());
       FunctionDecl *Old;
       if (const auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(LM.Method))
-        Old =
-            FunTmpl->getTemplatedDecl()->getPreviousDecl();
+        Old = FunTmpl->getTemplatedDecl()->getPreviousDecl();
       else
         Old = cast<FunctionDecl>(LM.Method)->getPreviousDecl();
       if (Old) {
diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp
index d664c1398ce45..bd6deebe761d1 100644
--- a/clang/lib/Sema/SemaAvailability.cpp
+++ b/clang/lib/Sema/SemaAvailability.cpp
@@ -551,8 +551,7 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K,
   case AR_Deprecated:
     // Suppress -Wdeprecated-declarations in implicit
     // functions.
-    if (const auto *FD = S.getCurFunctionDecl();
-        FD && FD->isImplicit())
+    if (const auto *FD = S.getCurFunctionDecl(); FD && FD->isImplicit())
       return;
 
     if (ObjCPropertyAccess)
diff --git a/clang/lib/Sema/SemaBoundsSafety.cpp b/clang/lib/Sema/SemaBoundsSafety.cpp
index 2dc2132158222..1e1d25bd0aff4 100644
--- a/clang/lib/Sema/SemaBoundsSafety.cpp
+++ b/clang/lib/Sema/SemaBoundsSafety.cpp
@@ -365,8 +365,7 @@ bool Sema::BoundsSafetyCheckInitialization(const InitializedEntity &Entity,
       Entity.getKind() != InitializedEntity::EK_Variable) {
 
     if (!CheckAssignmentToCountAttrPtrWithIncompletePointeeTy(
-            *this, LHSType, RHSExpr, Action, SL,
-            Entity.getDecl(),
+            *this, LHSType, RHSExpr, Action, SL, Entity.getDecl(),
             /*ShowFullQualifiedAssigneeName=*/true)) {
       return false;
     }
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 5c72e94398309..99b5c417cbbfd 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -7198,8 +7198,7 @@ void SemaCodeCompletion::CodeCompleteConstructorInitializer(
       InitializedBases.insert(getASTContext().getCanonicalType(
           QualType(Initializers[I]->getBaseClass(), 0)));
     else
-      InitializedFields.insert(
-          Initializers[I]->getAnyMember());
+      InitializedFields.insert(Initializers[I]->getAnyMember());
   }
 
   // Add completions for base classes.
@@ -7307,8 +7306,7 @@ void SemaCodeCompletion::CodeCompleteConstructorInitializer(
 
   // Add completions for members.
   for (auto *Field : ClassDecl->fields()) {
-    if (!InitializedFields.insert(Field->getCanonicalDecl())
-             .second) {
+    if (!InitializedFields.insert(Field->getCanonicalDecl()).second) {
       SawLastInitializer = !Initializers.empty() &&
                            Initializers.back()->isAnyMemberInitializer() &&
                            Initializers.back()->getAnyMember() == Field;
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index d893823053861..7473a3e4b3583 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -4781,9 +4781,9 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
     assert(!ToType->isReferenceType());
     if (SCS.Second == ICK_Derived_To_Base) {
       SmallVector<Expr*, 8> ConstructorArgs;
-      if (CompleteConstructorCall(
-              SCS.CopyConstructor, ToType, From,
-              /*FIXME:ConstructLoc*/ SourceLocation(), ConstructorArgs))
+      if (CompleteConstructorCall(SCS.CopyConstructor, ToType, From,
+                                  /*FIXME:ConstructLoc*/ SourceLocation(),
+                                  ConstructorArgs))
         return ExprError();
       return BuildCXXConstructExpr(
           /*FIXME:ConstructLoc*/ SourceLocation(), ToType,
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 7f7236d6e37e2..d38e7a8efd569 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -10451,8 +10451,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
     return QualType();
 
   case OR_No_Viable_Function: {
-    CXXRecordDecl *Primary =
-        Template->getTemplatedDecl();
+    CXXRecordDecl *Primary = Template->getTemplatedDecl();
     bool Complete = isCompleteType(Kind.getLocation(),
                                    Context.getCanonicalTagType(Primary));
     Candidates.NoteCandidates(
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 09d4000e411d2..8145a083394c5 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -25508,8 +25508,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPUsesAllocatorClause(
              diag::err_omp_predefined_allocator_with_traits)
             << D.AllocatorTraits->getSourceRange();
         Diag(D.Allocator->getExprLoc(), diag::note_omp_predefined_allocator)
-            << DRE->getDecl()->getName()
-            << D.Allocator->getSourceRange();
+            << DRE->getDecl()->getName() << D.Allocator->getSourceRange();
         continue;
       }
       // OpenMP [2.12.5, target Construct]
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 4a7fd34ad7750..c0cf4075581c7 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -13889,8 +13889,8 @@ class AddressOfFunctionResolver {
       // If we're in C, we need to support types that aren't exactly identical.
       if (!S.getLangOpts().CPlusPlus ||
           candidateHasExactlyCorrectType(FunDecl)) {
-        Matches.push_back(std::make_pair(
-            CurAccessFunPair, FunDecl->getCanonicalDecl()));
+        Matches.push_back(
+            std::make_pair(CurAccessFunPair, FunDecl->getCanonicalDecl()));
         FoundNonTemplateFunction = true;
         return true;
       }
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 4b219614cc6c3..b9794bc539e53 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -5811,10 +5811,9 @@ static bool diagnoseMissingArgument(Sema &S, SourceLocation Loc,
   // missing a module import.
   llvm::SmallVector<Module*, 8> Modules;
   if (D->hasDefaultArgument() && !S.hasReachableDefaultArgument(D, &Modules)) {
-    S.diagnoseMissingImport(Loc, TD,
-                            D->getDefaultArgumentLoc(), Modules,
+    S.diagnoseMissingImport(Loc, TD, D->getDefaultArgumentLoc(), Modules,
                             Sema::MissingImportKind::DefaultArgument,
-                            /*Recover*/true);
+                            /*Recover*/ true);
     return true;
   }
 
@@ -10555,8 +10554,7 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc,
   CheckExplicitInstantiation(*this, Record, NameLoc, true, TSK);
 
   // Verify that it is okay to explicitly instantiate here.
-  CXXRecordDecl *PrevDecl
-    = Record->getPreviousDecl();
+  CXXRecordDecl *PrevDecl = Record->getPreviousDecl();
   if (!PrevDecl && Record->getDefinition())
     PrevDecl = Record;
   if (PrevDecl) {
@@ -10573,14 +10571,12 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc,
       return TagD;
   }
 
-  CXXRecordDecl *RecordDef
-    = Record->getDefinition();
+  CXXRecordDecl *RecordDef = Record->getDefinition();
   if (!RecordDef) {
     // C++ [temp.explicit]p3:
     //   A definition of a member class of a class template shall be in scope
     //   at the point of an explicit instantiation of the member class.
-    CXXRecordDecl *Def
-      = Pattern->getDefinition();
+    CXXRecordDecl *Def = Pattern->getDefinition();
     if (!Def) {
       Diag(TemplateLoc, diag::err_explicit_instantiation_undefined_member)
         << 0 << Record->getDeclName() << Record->getDeclContext();
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp
index e5d848475d675..0998795dff2f9 100644
--- a/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -3521,8 +3521,7 @@ bool Sema::InstantiateClassImpl(
     CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs,
     TemplateSpecializationKind TSK, bool Complain) {
 
-  CXXRecordDecl *PatternDef
-    = Pattern->getDefinition();
+  CXXRecordDecl *PatternDef = Pattern->getDefinition();
   if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation,
                                 Instantiation->getInstantiatedFromMemberClass(),
                                      Pattern, PatternDef, TSK, Complain))
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index c748c4f239787..ea4c0b5324405 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -3943,8 +3943,8 @@ Decl *TemplateDeclInstantiator::VisitBaseUsingDecls(BaseUsingDecl *D,
       InstTarget = UnresolvedUsingIfExistsDecl::Create(
           SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
     } else {
-      InstTarget = SemaRef.FindInstantiatedDecl(
-          Shadow->getLocation(), OldTarget, TemplateArgs);
+      InstTarget = SemaRef.FindInstantiatedDecl(Shadow->getLocation(),
+                                                OldTarget, TemplateArgs);
     }
     if (!InstTarget)
       return nullptr;
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index b60fe924f1f38..729207cfbf21b 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1324,8 +1324,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
     llvm::SmallVector<TemplateArgument, 8> TemplateArgs;
     if (DS.isConstrainedAuto()) {
       if (TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId()) {
-        TypeConstraintConcept =
-            TemplateId->Template.get().getAsTemplateDecl();
+        TypeConstraintConcept = TemplateId->Template.get().getAsTemplateDecl();
         TemplateArgumentListInfo TemplateArgsInfo;
         TemplateArgsInfo.setLAngleLoc(TemplateId->LAngleLoc);
         TemplateArgsInfo.setRAngleLoc(TemplateId->RAngleLoc);
diff --git a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
index 721a08a738d18..8cfbed09e0080 100644
--- a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
@@ -246,8 +246,7 @@ void IvarInvalidationCheckerImpl::containsInvalidationMethod(
   // Check all methods.
   for (const auto *MDI : D->methods())
     if (isInvalidationMethod(MDI, Partial))
-      OutInfo.addInvalidationMethod(
-          MDI->getCanonicalDecl());
+      OutInfo.addInvalidationMethod(MDI->getCanonicalDecl());
 
   // If interface, check all parent protocols and super.
   if (const ObjCInterfaceDecl *InterfD = dyn_cast<ObjCInterfaceDecl>(D)) {
diff --git a/clang/lib/Tooling/Refactoring/Lookup.cpp b/clang/lib/Tooling/Refactoring/Lookup.cpp
index 3da9252cfc895..275a1f26a229b 100644
--- a/clang/lib/Tooling/Refactoring/Lookup.cpp
+++ b/clang/lib/Tooling/Refactoring/Lookup.cpp
@@ -74,8 +74,7 @@ usingFromDifferentCanonicalNamespace(const DeclContext *FromContext,
       return false;
     // Now check the names. If they match we have a different canonical
     // namespace with the same name.
-    if ((*FromIter)->getDeclName() ==
-        (*UseIter)->getDeclName())
+    if ((*FromIter)->getDeclName() == (*UseIter)->getDeclName())
       return true;
   }
   assert(FromIter == FromNamespaces.end() && UseIter == UseNamespaces.end());

>From 45859ca5e63f7568dddc1370ad375433a4f0c9f5 Mon Sep 17 00:00:00 2001
From: "Henrik G. Olsson" <h_olsson at apple.com>
Date: Thu, 9 Apr 2026 17:03:50 -0700
Subject: [PATCH 3/6] fix infinite recursion

---
 clang/lib/AST/ASTImporter.cpp   | 2 +-
 clang/lib/AST/ItaniumMangle.cpp | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index e507ed5ba4894..75c2ae7b7ac95 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -10033,7 +10033,7 @@ Expected<DeclContext *> ASTImporter::ImportContext(DeclContext *FromDC) {
 }
 
 Expected<Expr *> ASTImporter::Import(Expr *FromE) {
-  if (ExpectedStmt ToSOrErr = Import(FromE))
+  if (ExpectedStmt ToSOrErr = Import(cast_or_null<Stmt>(FromE)))
     return cast_or_null<Expr>(*ToSOrErr);
   else
     return ToSOrErr.takeError();
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 949074a39aa13..f58faa03bfa8c 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -4654,7 +4654,9 @@ void CXXNameMangler::mangleType(const DependentBitIntType *T) {
   Out << "_";
 }
 
-void CXXNameMangler::mangleType(const ArrayParameterType *T) { mangleType(T); }
+void CXXNameMangler::mangleType(const ArrayParameterType *T) {
+  mangleType(cast<ConstantArrayType>(T));
+}
 
 void CXXNameMangler::mangleType(const HLSLAttributedResourceType *T) {
   llvm::SmallString<64> Str("_Res");

>From 651d626e79e28ca5d5c51cb49e17452324016a5a Mon Sep 17 00:00:00 2001
From: "Henrik G. Olsson" <hnrklssn at gmail.com>
Date: Thu, 9 Apr 2026 22:17:20 -0700
Subject: [PATCH 4/6] emplace_back

Co-authored-by: Victor Chernyakin <chernyakin.victor.j at outlook.com>
---
 clang/lib/Sema/SemaOverload.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index c0cf4075581c7..aae2851a5f5cd 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -13889,8 +13889,7 @@ class AddressOfFunctionResolver {
       // If we're in C, we need to support types that aren't exactly identical.
       if (!S.getLangOpts().CPlusPlus ||
           candidateHasExactlyCorrectType(FunDecl)) {
-        Matches.push_back(
-            std::make_pair(CurAccessFunPair, FunDecl->getCanonicalDecl()));
+        Matches.emplace_back(CurAccessFunPair, FunDecl->getCanonicalDecl());
         FoundNonTemplateFunction = true;
         return true;
       }

>From 006b89a982fdd5025c0968ace57c444ccab09756 Mon Sep 17 00:00:00 2001
From: "Henrik G. Olsson" <h_olsson at apple.com>
Date: Thu, 9 Apr 2026 22:33:29 -0700
Subject: [PATCH 5/6] revert change that breaks ivar matching

---
 clang/lib/AST/ASTStructuralEquivalence.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp
index 50a7790c6353e..9d970651a9e65 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -2464,7 +2464,8 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   if (D1->getAccessControl() != D2->getAccessControl())
     return false;
 
-  return IsStructurallyEquivalent(Context, D1, D2, Owner2Type);
+  return IsStructurallyEquivalent(Context, cast<FieldDecl>(D1),
+                                  cast<FieldDecl>(D2), Owner2Type);
 }
 
 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,

>From 7fe8430469cca8a5bd1d300ee9cbf7a87c2b2a7a Mon Sep 17 00:00:00 2001
From: "Henrik G. Olsson" <h_olsson at apple.com>
Date: Wed, 15 Apr 2026 16:59:36 -0700
Subject: [PATCH 6/6] replace `auto` where not obvious from context

---
 clang/lib/AST/ByteCode/Interp.cpp                   | 5 +++--
 clang/lib/Analysis/Consumed.cpp                     | 2 +-
 clang/lib/Analysis/ThreadSafetyCommon.cpp           | 2 +-
 clang/lib/CodeGen/CGStmtOpenMP.cpp                  | 4 ++--
 clang/lib/Sema/SemaAvailability.cpp                 | 2 +-
 clang/lib/Sema/SemaInit.cpp                         | 3 ++-
 clang/lib/Sema/SemaOpenMP.cpp                       | 2 +-
 clang/lib/Sema/SemaTemplate.cpp                     | 3 ++-
 clang/lib/Serialization/ASTReader.cpp               | 2 +-
 clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 2 +-
 clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp   | 2 +-
 11 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 49033d5adb914..ba8754cffb3f0 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -18,6 +18,7 @@
 #include "State.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/CXXInheritance.h"
+#include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
@@ -444,7 +445,7 @@ bool CheckConstant(InterpState &S, CodePtr OpPC, const Descriptor *Desc) {
   // If we're evaluating the initializer for a constexpr variable in C23, we may
   // only read other contexpr variables. Abort here since this one isn't
   // constexpr.
-  if (const auto *VD = S.EvaluatingDecl;
+  if (const VarDecl *VD = S.EvaluatingDecl;
       VD && VD->isConstexpr() && S.getLangOpts().C23)
     return Invalid(S, OpPC);
 
@@ -1772,7 +1773,7 @@ bool CallVirt(InterpState &S, CodePtr OpPC, const Function *Func,
     return false;
   assert(DynamicDecl);
 
-  const auto *StaticDecl = Func->getParentDecl();
+  const CXXRecordDecl *StaticDecl = Func->getParentDecl();
   const auto *InitialFunction = cast<CXXMethodDecl>(Callee);
   const CXXMethodDecl *Overrider;
 
diff --git a/clang/lib/Analysis/Consumed.cpp b/clang/lib/Analysis/Consumed.cpp
index 67930e38da885..7041856376a60 100644
--- a/clang/lib/Analysis/Consumed.cpp
+++ b/clang/lib/Analysis/Consumed.cpp
@@ -804,7 +804,7 @@ void ConsumedStmtVisitor::VisitCXXMemberCallExpr(
 
 void ConsumedStmtVisitor::VisitCXXOperatorCallExpr(
     const CXXOperatorCallExpr *Call) {
-  const auto *FunDecl = Call->getDirectCallee();
+  const FunctionDecl *FunDecl = Call->getDirectCallee();
   if (!FunDecl) return;
 
   if (Call->getOperator() == OO_Equal) {
diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp
index 83c337e769042..33ea6e137a2bf 100644
--- a/clang/lib/Analysis/ThreadSafetyCommon.cpp
+++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp
@@ -480,7 +480,7 @@ til::SExpr *SExprBuilder::translateObjCIVarRefExpr(const ObjCIvarRefExpr *IVRE,
   til::SExpr *BE = translate(IVRE->getBase(), Ctx);
   til::SExpr *E = new (Arena) til::SApply(BE);
 
-  const auto *D = IVRE->getDecl()->getCanonicalDecl();
+  const ObjCIvarDecl *D = IVRE->getDecl()->getCanonicalDecl();
 
   til::Project *P = new (Arena) til::Project(E, D);
   if (hasAnyPointerType(BE))
diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index 65dd1b24692cb..672987dad84ef 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -2453,7 +2453,7 @@ void CodeGenFunction::EmitOMPInnerLoop(
   const SourceRange R = S.getSourceRange();
 
   // If attributes are attached, push to the basic block with them.
-  const auto &OMPED = S;
+  const OMPExecutableDirective &OMPED = S;
   const CapturedStmt *ICS = OMPED.getInnermostCapturedStmt();
   const Stmt *SS = ICS->getCapturedStmt();
   const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(SS);
@@ -2699,7 +2699,7 @@ void CodeGenFunction::EmitOMPLinearClause(
   llvm::DenseSet<const VarDecl *> SIMDLCVs;
   OpenMPDirectiveKind EKind = getEffectiveDirectiveKind(D);
   if (isOpenMPSimdDirective(EKind)) {
-    const auto *LoopDirective = &D;
+    const OMPLoopDirective *LoopDirective = &D;
     for (const Expr *C : LoopDirective->counters()) {
       SIMDLCVs.insert(
           cast<VarDecl>(cast<DeclRefExpr>(C)->getDecl())->getCanonicalDecl());
diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp
index bd6deebe761d1..e25aa17817daf 100644
--- a/clang/lib/Sema/SemaAvailability.cpp
+++ b/clang/lib/Sema/SemaAvailability.cpp
@@ -551,7 +551,7 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K,
   case AR_Deprecated:
     // Suppress -Wdeprecated-declarations in implicit
     // functions.
-    if (const auto *FD = S.getCurFunctionDecl(); FD && FD->isImplicit())
+    if (const FunctionDecl *FD = S.getCurFunctionDecl(); FD && FD->isImplicit())
       return;
 
     if (ObjCPropertyAccess)
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index d38e7a8efd569..274f130beac5c 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -12,6 +12,7 @@
 
 #include "CheckExprLifetime.h"
 #include "clang/AST/ASTContext.h"
+#include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
@@ -10310,7 +10311,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
         Pattern = Pattern->getInstantiatedFromMemberTemplate();
       }
 
-      auto *RD = Pattern->getTemplatedDecl();
+      const CXXRecordDecl *RD = Pattern->getTemplatedDecl();
       if (!(RD->getDefinition() && RD->isAggregate()))
         return;
       QualType Ty = Context.getCanonicalTagType(RD);
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 8145a083394c5..e3ee2c114eccb 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -23010,7 +23010,7 @@ static ExprResult buildImplicitMapper(Sema &S, QualType BaseType,
     S.PushOnScopeChains(DMD, Scope, /*AddToContext=*/false);
   DCT->addDecl(DMD);
   DMD->setAccess(clang::AS_none);
-  auto *VD = MapperVarRef->getDecl();
+  ValueDecl *VD = MapperVarRef->getDecl();
   VD->setDeclContext(DMD);
   VD->setLexicalDeclContext(DMD);
   DMD->addDecl(VD);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index b9794bc539e53..e1e418c85d4ac 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -12,6 +12,7 @@
 #include "clang/AST/ASTConcept.h"
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/ASTContext.h"
+#include "clang/AST/Attr.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclFriend.h"
 #include "clang/AST/DeclTemplate.h"
@@ -10165,7 +10166,7 @@ static bool ScopeSpecifierHasTemplateId(const CXXScopeSpec &SS) {
 /// effect.
 static void dllExportImportClassTemplateSpecialization(
     Sema &S, ClassTemplateSpecializationDecl *Def) {
-  auto *A = getDLLAttr(Def);
+  InheritableAttr *A = getDLLAttr(Def);
   assert(A && "dllExportImportClassTemplateSpecialization called "
               "on Def without dllexport or dllimport");
 
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 9777786c36a5b..c003d45b97520 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -9675,7 +9675,7 @@ void ASTReader::ReadUnusedLocalTypedefNameCandidates(
 void ASTReader::ReadDeclsToCheckForDeferredDiags(
     llvm::SmallSetVector<Decl *, 4> &Decls) {
   for (auto I : DeclsToCheckForDeferredDiags) {
-    auto *D = GetDecl(I);
+    Decl *D = GetDecl(I);
     if (D)
       Decls.insert(D);
   }
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
index e26d0cff0d40d..d96131e7d6953 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
@@ -3140,7 +3140,7 @@ static bool isSmartPtrType(QualType QT) {
     if (!TD)
       return false;
 
-    const auto *ND = TD->getTemplatedDecl();
+    const NamedDecl *ND = TD->getTemplatedDecl();
     if (!ND)
       return false;
 
diff --git a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
index f25fb54e77d1e..529a9d881e398 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
@@ -581,7 +581,7 @@ void MoveChecker::explainObject(ProgramStateRef State, llvm::raw_ostream &OS,
   // and we never know if we are to explain anything until we try.
   if (const auto DR =
           dyn_cast_or_null<DeclRegion>(unwrapRValueReferenceIndirection(MR))) {
-    const auto *RegionDecl = DR->getDecl();
+    const NamedDecl *RegionDecl = DR->getDecl();
     OS << " '" << RegionDecl->getDeclName() << "'";
   }
 



More information about the cfe-commits mailing list