https://github.com/kazutakahirata created https://github.com/llvm/llvm-project/pull/225614
Note that PointerUnion::dyn_cast has been soft deprecated in PointerUnion.h: // FIXME: Replace the uses of is(), get() and dyn_cast() with // isa<T>, cast<T> and the llvm::dyn_cast<T> Literal migration would result in dyn_cast_if_present (see the definition of PointerUnion::dyn_cast), but this patch uses dyn_cast on UnexpandedParameterPack::first because it is always nonnull. Specifically, UnexpandedParameterPack is constructed only in the following places, all of which store a nonnull pointer in first, and first is never modified afterward: - CollectUnexpandedParameterPacksVisitor::addUnexpanded in SemaTemplateVariadic.cpp - TransformLambdaExpr in TreeTransform.h - TransformSizeOfPackExpr in TreeTransform.h Assisted-by: Antigravity >From f6bc67208ae56fbfaa0b8f6bc68ff0b80485655e Mon Sep 17 00:00:00 2001 From: Kazu Hirata <[email protected]> Date: Mon, 21 Sep 2026 11:02:08 -0700 Subject: [PATCH] [clang] Migrate away from PointerUnion::dyn_cast (NFC) Note that PointerUnion::dyn_cast has been soft deprecated in PointerUnion.h: // FIXME: Replace the uses of is(), get() and dyn_cast() with // isa<T>, cast<T> and the llvm::dyn_cast<T> Literal migration would result in dyn_cast_if_present (see the definition of PointerUnion::dyn_cast), but this patch uses dyn_cast on UnexpandedParameterPack::first because it is always nonnull. Specifically, UnexpandedParameterPack is constructed only in the following places, all of which store a nonnull pointer in first, and first is never modified afterward: - CollectUnexpandedParameterPacksVisitor::addUnexpanded in SemaTemplateVariadic.cpp - TransformLambdaExpr in TreeTransform.h - TransformSizeOfPackExpr in TreeTransform.h Assisted-by: Antigravity --- clang/lib/Sema/SemaTemplate.cpp | 2 +- clang/lib/Sema/SemaTemplateInstantiate.cpp | 2 +- clang/lib/Sema/SemaTemplateVariadic.cpp | 33 +++++++++------------- clang/lib/Sema/TreeTransform.h | 2 +- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 466515550381a2..593bfb051dfa1e 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -5958,7 +5958,7 @@ bool Sema::CheckTemplateArgumentList( llvm::SmallVector<UnexpandedParameterPack> Unexpanded; collectUnexpandedParameterPacks(TL.getPatternLoc(), Unexpanded); for (const auto &UPP : Unexpanded) { - auto *TST = UPP.first.dyn_cast<const TemplateSpecializationType *>(); + auto *TST = dyn_cast<const TemplateSpecializationType *>(UPP.first); if (!TST) continue; assert(isPackProducingBuiltinTemplateName(TST->getTemplateName())); diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index bbca1267461e49..06ea12ca7bd73b 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -3406,7 +3406,7 @@ PreparePackForExpansion(Sema &S, const CXXBaseSpecifier &Base, // that required a substituion first. bool SawPackTypes = llvm::any_of(Unexpanded, [](UnexpandedParameterPack P) { - return P.first.dyn_cast<const SubstBuiltinTemplatePackType *>(); + return isa<const SubstBuiltinTemplatePackType *>(P.first); }); if (!SawPackTypes) { Info.Expand = false; diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp index 3235750f408ffb..bbac53b5b2acf2 100644 --- a/clang/lib/Sema/SemaTemplateVariadic.cpp +++ b/clang/lib/Sema/SemaTemplateVariadic.cpp @@ -505,10 +505,10 @@ Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc, for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) { IdentifierInfo *Name = nullptr; - if (const TemplateTypeParmType *TTP - = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) + if (const TemplateTypeParmType *TTP = + dyn_cast<const TemplateTypeParmType *>(Unexpanded[I].first)) Name = TTP->getIdentifier(); - else if (NamedDecl *ND = Unexpanded[I].first.dyn_cast<NamedDecl *>()) + else if (NamedDecl *ND = dyn_cast<NamedDecl *>(Unexpanded[I].first)) Name = ND->getIdentifier(); if (Name && NamesKnown.insert(Name).second) @@ -583,7 +583,7 @@ bool Sema::DiagnoseUnexpandedParameterPackInRequiresExpr(RequiresExpr *RE) { llvm::SmallPtrSet<NamedDecl *, 8> ParmSet(llvm::from_range, Parms); SmallVector<UnexpandedParameterPack, 2> UnexpandedParms; for (auto Parm : Unexpanded) - if (ParmSet.contains(Parm.first.dyn_cast<NamedDecl *>())) + if (ParmSet.contains(dyn_cast<NamedDecl *>(Parm.first))) UnexpandedParms.push_back(Parm); if (UnexpandedParms.empty()) return false; @@ -875,13 +875,12 @@ bool Sema::CheckParameterPacksForExpansion( FunctionParmPackExpr *BindingPack = nullptr; std::optional<unsigned> NumPrecomputedArguments; - if (auto *TTP = ParmPack.first.dyn_cast<const TemplateTypeParmType *>()) { + if (auto *TTP = dyn_cast<const TemplateTypeParmType *>(ParmPack.first)) { Depth = TTP->getDepth(); Index = TTP->getIndex(); Name = TTP->getIdentifier(); - } else if (auto *TST = - ParmPack.first - .dyn_cast<const TemplateSpecializationType *>()) { + } else if (auto *TST = dyn_cast<const TemplateSpecializationType *>( + ParmPack.first)) { assert(isPackProducingBuiltinTemplateName(TST->getTemplateName())); // Delay expansion, substitution is required to know the size. ShouldExpand = false; @@ -896,9 +895,8 @@ bool Sema::CheckParameterPacksForExpansion( : EllipsisLoc, diag::err_unsupported_builtin_template_pack_expansion) << TST->getTemplateName(); - } else if (auto *S = - ParmPack.first - .dyn_cast<const SubstBuiltinTemplatePackType *>()) { + } else if (auto *S = dyn_cast<const SubstBuiltinTemplatePackType *>( + ParmPack.first)) { Name = nullptr; NumPrecomputedArguments = S->getNumArgs(); } else { @@ -1088,20 +1086,17 @@ UnsignedOrNone Sema::getNumArgumentsInExpansionFromUnexpanded( unsigned Index; if (const TemplateTypeParmType *TTP = - Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) { + dyn_cast<const TemplateTypeParmType *>(Unexpanded[I].first)) { Depth = TTP->getDepth(); Index = TTP->getIndex(); - } else if (auto *TST = - Unexpanded[I] - .first.dyn_cast<const TemplateSpecializationType *>()) { + } else if (auto *TST = dyn_cast<const TemplateSpecializationType *>( + Unexpanded[I].first)) { // This is a dependent pack, we are not ready to expand it yet. assert(isPackProducingBuiltinTemplateName(TST->getTemplateName())); (void)TST; return std::nullopt; - } else if (auto *PST = - Unexpanded[I] - .first - .dyn_cast<const SubstBuiltinTemplatePackType *>()) { + } else if (auto *PST = dyn_cast<const SubstBuiltinTemplatePackType *>( + Unexpanded[I].first)) { assert((!Result || *Result == PST->getNumArgs()) && "inconsistent pack sizes"); Result = PST->getNumArgs(); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 942fb586b1f239..8cd2e2e62a81ca 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -5466,7 +5466,7 @@ bool TreeTransform<Derived>::PreparePackForExpansion(TemplateArgumentLoc In, // that required a substituion first. bool SawPackTypes = llvm::any_of(Unexpanded, [](UnexpandedParameterPack P) { - return P.first.dyn_cast<const SubstBuiltinTemplatePackType *>(); + return isa<const SubstBuiltinTemplatePackType *>(P.first); }); if (!SawPackTypes) { Info.Expand = false; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
