[clang] [Clang] Use llvm::dyn_cast instead of dyn_cast on PointerUnion (PR #216354)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 14 09:49:51 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-static-analyzer-1
@llvm/pr-subscribers-clang-temporal-safety
Author: Marc Auberer (marcauberer)
<details>
<summary>Changes</summary>
This is part of the migration from `PointerUnion<PTs>::dyn_cast<T>()` to `llvm::dyn_cast<T>(PointerUnion)`.
The dyn_cast method on PointerUnion is simply a wrapper around `llvm::dyn_cast_if_present`, which means that it can be replaced with `llvm::dyn_cast` for all non-optional types.
---
Full diff: https://github.com/llvm/llvm-project/pull/216354.diff
19 Files Affected:
- (modified) clang/include/clang/Analysis/Analyses/LifetimeSafety/Loans.h (+6-6)
- (modified) clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h (+2-2)
- (modified) clang/include/clang/Basic/FileEntry.h (+1-1)
- (modified) clang/include/clang/Lex/PreprocessingRecord.h (+1-1)
- (modified) clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h (+2-4)
- (modified) clang/lib/APINotes/APINotesManager.cpp (+2-2)
- (modified) clang/lib/Analysis/LifetimeSafety/Checker.cpp (+12-12)
- (modified) clang/lib/Analysis/LifetimeSafety/LiveOrigins.cpp (+2-2)
- (modified) clang/lib/CodeGen/CGBlocks.cpp (+1-1)
- (modified) clang/lib/Frontend/SARIFDiagnostic.cpp (+1-1)
- (modified) clang/lib/Index/FileIndexRecord.cpp (+1-1)
- (modified) clang/lib/Index/IndexDecl.cpp (+1-1)
- (modified) clang/lib/Serialization/ASTReaderStmt.cpp (+1-1)
- (modified) clang/lib/Serialization/ASTWriter.cpp (+1-1)
- (modified) clang/lib/Serialization/ASTWriterDecl.cpp (+2-2)
- (modified) clang/lib/Serialization/ASTWriterStmt.cpp (+2-2)
- (modified) clang/lib/Serialization/MultiOnDiskHashTable.h (+3-2)
- (modified) clang/lib/StaticAnalyzer/Core/BugSuppression.cpp (+1-1)
- (modified) clang/unittests/CodeGen/IRMatchers.h (+1-1)
``````````diff
diff --git a/clang/include/clang/Analysis/Analyses/LifetimeSafety/Loans.h b/clang/include/clang/Analysis/Analyses/LifetimeSafety/Loans.h
index 8137a207290d7..78bbfdeaf2ef5 100644
--- a/clang/include/clang/Analysis/Analyses/LifetimeSafety/Loans.h
+++ b/clang/include/clang/Analysis/Analyses/LifetimeSafety/Loans.h
@@ -82,11 +82,11 @@ class PlaceholderBase : public llvm::FoldingSetNode {
PlaceholderBase(const CXXMethodDecl *MD) : ParamOrMethod(MD) {}
const ParmVarDecl *getParmVarDecl() const {
- return ParamOrMethod.dyn_cast<const ParmVarDecl *>();
+ return dyn_cast<const ParmVarDecl *>(ParamOrMethod);
}
const CXXMethodDecl *getImplicitThisParent() const {
- return ParamOrMethod.dyn_cast<const CXXMethodDecl *>();
+ return dyn_cast<const CXXMethodDecl *>(ParamOrMethod);
}
void Profile(llvm::FoldingSetNodeID &ID) const {
@@ -134,19 +134,19 @@ class AccessPath {
}
const clang::ValueDecl *getAsValueDecl() const {
- return Base.dyn_cast<const clang::ValueDecl *>();
+ return dyn_cast<const clang::ValueDecl *>(Base);
}
const clang::MaterializeTemporaryExpr *getAsMaterializeTemporaryExpr() const {
- return Base.dyn_cast<const clang::MaterializeTemporaryExpr *>();
+ return dyn_cast<const clang::MaterializeTemporaryExpr *>(Base);
}
const PlaceholderBase *getAsPlaceholderBase() const {
- return Base.dyn_cast<const PlaceholderBase *>();
+ return dyn_cast<const PlaceholderBase *>(Base);
}
const clang::CXXNewExpr *getAsNewAllocation() const {
- return Base.dyn_cast<const clang::CXXNewExpr *>();
+ return dyn_cast<const clang::CXXNewExpr *>(Base);
}
bool operator==(const AccessPath &RHS) const {
diff --git a/clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h b/clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h
index 6ab2f59283ad3..9e696ab11dc24 100644
--- a/clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h
+++ b/clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h
@@ -59,10 +59,10 @@ struct Origin {
: ID(ID), Ptr(E), Ty(QT) {}
const clang::ValueDecl *getDecl() const {
- return Ptr.dyn_cast<const clang::ValueDecl *>();
+ return dyn_cast<const clang::ValueDecl *>(Ptr);
}
const clang::Expr *getExpr() const {
- return Ptr.dyn_cast<const clang::Expr *>();
+ return dyn_cast<const clang::Expr *>(Ptr);
}
};
diff --git a/clang/include/clang/Basic/FileEntry.h b/clang/include/clang/Basic/FileEntry.h
index b22b6c00bb6ce..2b1b175aa5ce2 100644
--- a/clang/include/clang/Basic/FileEntry.h
+++ b/clang/include/clang/Basic/FileEntry.h
@@ -169,7 +169,7 @@ class FileEntryRef {
/// Retrieve the base MapEntry after redirects.
const MapEntry &getBaseMapEntry() const {
const MapEntry *Base = ME;
- while (const auto *Next = Base->second->V.dyn_cast<const MapEntry *>())
+ while (const auto *Next = dyn_cast<const MapEntry *>(Base->second->V))
Base = Next;
return *Base;
}
diff --git a/clang/include/clang/Lex/PreprocessingRecord.h b/clang/include/clang/Lex/PreprocessingRecord.h
index 7886aef7f0c7f..1c45f02902b36 100644
--- a/clang/include/clang/Lex/PreprocessingRecord.h
+++ b/clang/include/clang/Lex/PreprocessingRecord.h
@@ -192,7 +192,7 @@ class Token;
/// The definition of the macro being expanded. May return null if
/// this is a builtin macro.
MacroDefinitionRecord *getDefinition() const {
- return NameOrDef.dyn_cast<MacroDefinitionRecord *>();
+ return dyn_cast<MacroDefinitionRecord *>(NameOrDef);
}
// Implement isa/cast/dyncast/etc.
diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
index 2010e4b0da84b..f854c25ede852 100644
--- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
+++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
@@ -230,9 +230,7 @@ class CallEvent {
/// Returns the declaration of the function or method that will be
/// called. May be null.
- virtual const Decl *getDecl() const {
- return Origin.dyn_cast<const Decl *>();
- }
+ virtual const Decl *getDecl() const { return dyn_cast<const Decl *>(Origin); }
bool isForeign() const {
assert(Foreign && "Foreign must be set before querying");
@@ -260,7 +258,7 @@ class CallEvent {
/// Returns the expression whose value will be the result of this call.
/// Null if and only if 'this' is a CXXDestructorCall.
virtual const Expr *getOriginExpr() const {
- return Origin.dyn_cast<const Expr *>();
+ return dyn_cast<const Expr *>(Origin);
}
/// Returns the number of arguments (explicit and implicit).
diff --git a/clang/lib/APINotes/APINotesManager.cpp b/clang/lib/APINotes/APINotesManager.cpp
index 2cc801d5415b8..f3d7ed4e5ebc1 100644
--- a/clang/lib/APINotes/APINotesManager.cpp
+++ b/clang/lib/APINotes/APINotesManager.cpp
@@ -429,7 +429,7 @@ APINotesManager::findAPINotes(SourceLocation Loc) {
}
// Grab the result.
- if (auto Reader = Readers[*Dir].dyn_cast<APINotesReader *>())
+ if (auto Reader = dyn_cast<APINotesReader *>(Readers[*Dir]))
Results.push_back(Reader);
break;
}
@@ -444,7 +444,7 @@ APINotesManager::findAPINotes(SourceLocation Loc) {
if (auto APINotesFile = FileMgr.getOptionalFileRef(APINotesPath)) {
if (!loadAPINotes(*Dir, *APINotesFile)) {
++NumHeaderAPINotes;
- if (auto Reader = Readers[*Dir].dyn_cast<APINotesReader *>())
+ if (auto Reader = dyn_cast<APINotesReader *>(Readers[*Dir]))
Results.push_back(Reader);
break;
}
diff --git a/clang/lib/Analysis/LifetimeSafety/Checker.cpp b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
index a8c285f2bffd6..399413a02af87 100644
--- a/clang/lib/Analysis/LifetimeSafety/Checker.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
@@ -73,9 +73,9 @@ class LifetimeChecker {
static SourceLocation
GetFactLoc(llvm::PointerUnion<const UseFact *, const OriginEscapesFact *> F) {
- if (const auto *UF = F.dyn_cast<const UseFact *>())
+ if (const auto *UF = dyn_cast<const UseFact *>(F))
return UF->getUseExpr()->getExprLoc();
- if (const auto *OEF = F.dyn_cast<const OriginEscapesFact *>()) {
+ if (const auto *OEF = dyn_cast<const OriginEscapesFact *>(F)) {
if (auto *ReturnEsc = dyn_cast<ReturnEscapeFact>(OEF))
return ReturnEsc->getReturnExpr()->getExprLoc();
if (auto *FieldEsc = dyn_cast<FieldEscapeFact>(OEF))
@@ -268,7 +268,7 @@ class LifetimeChecker {
const Expr *MovedExpr = Warning.MovedExpr;
SourceLocation ExpiryLoc = Warning.ExpiryLoc;
- if (const auto *UF = CausingFact.dyn_cast<const UseFact *>()) {
+ if (const auto *UF = dyn_cast<const UseFact *>(CausingFact)) {
llvm::SmallVector<const Expr *> ExprChain =
getExprChain(LoanPropagation.buildOriginFlowChain(UF, LID, Cfg));
if (Warning.InvalidatedByExpr) {
@@ -289,7 +289,7 @@ class LifetimeChecker {
MovedExpr, ExpiryLoc, ExprChain);
} else if (const auto *OEF =
- CausingFact.dyn_cast<const OriginEscapesFact *>()) {
+ dyn_cast<const OriginEscapesFact *>(CausingFact)) {
if (Warning.InvalidatedByExpr) {
if (const auto *FieldEscape = dyn_cast<FieldEscapeFact>(OEF)) {
// Invalidated object escapes to a field.
@@ -421,10 +421,10 @@ class LifetimeChecker {
return;
llvm::TimeTraceScope TimeTrace("SuggestAnnotations");
for (auto [Target, EscapeTarget] : AnnotationWarningsMap) {
- if (const auto *PVD = Target.dyn_cast<const ParmVarDecl *>())
+ if (const auto *PVD = dyn_cast<const ParmVarDecl *>(Target))
suggestWithScopeForParmVar(PVD, EscapeTarget);
- else if (const auto *MD = Target.dyn_cast<const CXXMethodDecl *>()) {
- if (const auto *EscapeExpr = EscapeTarget.dyn_cast<const Expr *>())
+ else if (const auto *MD = dyn_cast<const CXXMethodDecl *>(Target)) {
+ if (const auto *EscapeExpr = dyn_cast<const Expr *>(EscapeTarget))
suggestWithScopeForImplicitThis(MD, EscapeExpr);
else
llvm_unreachable("Implicit this can only escape via Expr (return)");
@@ -434,11 +434,11 @@ class LifetimeChecker {
void reportNoescapeViolations() {
for (auto [PVD, EscapeTarget] : NoescapeWarningsMap) {
- if (const auto *E = EscapeTarget.dyn_cast<const Expr *>())
+ if (const auto *E = dyn_cast<const Expr *>(EscapeTarget))
SemaHelper->reportNoescapeViolation(PVD, E);
- else if (const auto *FD = EscapeTarget.dyn_cast<const FieldDecl *>())
+ else if (const auto *FD = dyn_cast<const FieldDecl *>(EscapeTarget))
SemaHelper->reportNoescapeViolation(PVD, FD);
- else if (const auto *G = EscapeTarget.dyn_cast<const VarDecl *>())
+ else if (const auto *G = dyn_cast<const VarDecl *>(EscapeTarget))
SemaHelper->reportNoescapeViolation(PVD, G);
else
llvm_unreachable("Unhandled EscapingTarget type");
@@ -517,10 +517,10 @@ class LifetimeChecker {
void inferAnnotations() {
for (auto [Target, EscapeTarget] : AnnotationWarningsMap) {
- if (const auto *MD = Target.dyn_cast<const CXXMethodDecl *>()) {
+ if (const auto *MD = dyn_cast<const CXXMethodDecl *>(Target)) {
if (!implicitObjectParamIsLifetimeBound(MD))
SemaHelper->addLifetimeBoundToImplicitThis(cast<CXXMethodDecl>(MD));
- } else if (const auto *PVD = Target.dyn_cast<const ParmVarDecl *>()) {
+ } else if (const auto *PVD = dyn_cast<const ParmVarDecl *>(Target)) {
const auto *FD = dyn_cast<FunctionDecl>(PVD->getDeclContext());
if (!FD)
continue;
diff --git a/clang/lib/Analysis/LifetimeSafety/LiveOrigins.cpp b/clang/lib/Analysis/LifetimeSafety/LiveOrigins.cpp
index b64acc56a2221..f834f24921aaa 100644
--- a/clang/lib/Analysis/LifetimeSafety/LiveOrigins.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/LiveOrigins.cpp
@@ -60,9 +60,9 @@ struct Lattice {
};
static SourceLocation GetFactLoc(CausingFactType F) {
- if (const auto *UF = F.dyn_cast<const UseFact *>())
+ if (const auto *UF = dyn_cast<const UseFact *>(F))
return UF->getUseExpr()->getExprLoc();
- if (const auto *OEF = F.dyn_cast<const OriginEscapesFact *>()) {
+ if (const auto *OEF = dyn_cast<const OriginEscapesFact *>(F)) {
if (auto *ReturnEsc = dyn_cast<ReturnEscapeFact>(OEF))
return ReturnEsc->getReturnExpr()->getExprLoc();
if (auto *FieldEsc = dyn_cast<FieldEscapeFact>(OEF))
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp
index 0683a4937cf37..2a6f3dcb39a04 100644
--- a/clang/lib/CodeGen/CGBlocks.cpp
+++ b/clang/lib/CodeGen/CGBlocks.cpp
@@ -1094,7 +1094,7 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {
auto *EWC = llvm::dyn_cast_or_null<ExprWithCleanups>(RetExpr);
if (EWC)
for (auto &C : EWC->getObjects())
- if (auto *BD = C.dyn_cast<BlockDecl *>())
+ if (auto *BD = dyn_cast<BlockDecl *>(C))
if (BD == blockDecl)
return true;
return false;
diff --git a/clang/lib/Frontend/SARIFDiagnostic.cpp b/clang/lib/Frontend/SARIFDiagnostic.cpp
index 5183462b76f41..4ec8cd4665443 100644
--- a/clang/lib/Frontend/SARIFDiagnostic.cpp
+++ b/clang/lib/Frontend/SARIFDiagnostic.cpp
@@ -41,7 +41,7 @@ void SARIFDiagnostic::emitDiagnosticMessage(
StringRef Message, ArrayRef<clang::CharSourceRange> Ranges,
DiagOrStoredDiag D) {
- const auto *Diag = D.dyn_cast<const Diagnostic *>();
+ const auto *Diag = dyn_cast<const Diagnostic *>(D);
if (!Diag)
return;
diff --git a/clang/lib/Index/FileIndexRecord.cpp b/clang/lib/Index/FileIndexRecord.cpp
index d6b0ee5c4ff10..a419fffc41a92 100644
--- a/clang/lib/Index/FileIndexRecord.cpp
+++ b/clang/lib/Index/FileIndexRecord.cpp
@@ -44,7 +44,7 @@ void FileIndexRecord::addMacroOccurence(SymbolRoleSet Roles, unsigned Offset,
void FileIndexRecord::removeHeaderGuardMacros() {
llvm::erase_if(Decls, [](const DeclOccurrence &D) {
- if (const auto *MI = D.DeclOrMacro.dyn_cast<const MacroInfo *>())
+ if (const auto *MI = dyn_cast<const MacroInfo *>(D.DeclOrMacro))
return MI->isUsedForHeaderGuard();
return false;
});
diff --git a/clang/lib/Index/IndexDecl.cpp b/clang/lib/Index/IndexDecl.cpp
index df875e0b40079..44795c3061c28 100644
--- a/clang/lib/Index/IndexDecl.cpp
+++ b/clang/lib/Index/IndexDecl.cpp
@@ -213,7 +213,7 @@ class IndexingDeclVisitor : public ConstDeclVisitor<IndexingDeclVisitor, bool> {
llvm::PointerUnion<ClassTemplateDecl *,
ClassTemplatePartialSpecializationDecl *>
Template = CTSD->getSpecializedTemplateOrPartial();
- if (const auto *CTD = Template.dyn_cast<ClassTemplateDecl *>()) {
+ if (const auto *CTD = dyn_cast<ClassTemplateDecl *>(Template)) {
const CXXRecordDecl *Pattern = CTD->getTemplatedDecl();
bool TypeOverride = isa<TypeDecl>(D);
for (const NamedDecl *ND : Pattern->lookup(D->getDeclName())) {
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 1afde95b05290..50bf74e0ec779 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -939,7 +939,7 @@ void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) {
break;
}
}
- if (Expr *Ex = E.dyn_cast<Expr *>())
+ if (Expr *Ex = dyn_cast<Expr *>(E))
R = new (Record.getContext()) concepts::ExprRequirement(
Ex, RK == concepts::Requirement::RK_Simple, NoexceptLoc,
std::move(*Req), Status, SubstitutedConstraintExpr);
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index f34b2ff182bc8..2eeeadd416398 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -6650,7 +6650,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(ASTContext &Context,
// specialization. If so, record which one.
auto From = Spec->getInstantiatedFrom();
if (auto PartialSpec =
- From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
+ dyn_cast<ClassTemplatePartialSpecializationDecl *>(From)) {
Record.push_back(true);
Record.AddDeclRef(PartialSpec);
Record.AddTemplateArgumentList(
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index d8f5ed9afdde1..c66519165a593 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -1933,7 +1933,7 @@ void ASTDeclWriter::VisitClassTemplateSpecializationDecl(
llvm::PointerUnion<ClassTemplateDecl *,
ClassTemplatePartialSpecializationDecl *> InstFrom
= D->getSpecializedTemplateOrPartial();
- if (Decl *InstFromD = InstFrom.dyn_cast<ClassTemplateDecl *>()) {
+ if (Decl *InstFromD = dyn_cast<ClassTemplateDecl *>(InstFrom)) {
Record.AddDeclRef(InstFromD);
} else {
Record.AddDeclRef(cast<ClassTemplatePartialSpecializationDecl *>(InstFrom));
@@ -2016,7 +2016,7 @@ void ASTDeclWriter::VisitVarTemplateSpecializationDecl(
llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
InstFrom = D->getSpecializedTemplateOrPartial();
- if (Decl *InstFromD = InstFrom.dyn_cast<VarTemplateDecl *>()) {
+ if (Decl *InstFromD = dyn_cast<VarTemplateDecl *>(InstFrom)) {
Record.AddDeclRef(InstFromD);
} else {
Record.AddDeclRef(cast<VarTemplatePartialSpecializationDecl *>(InstFrom));
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index 3854eabd62a46..a47af63da383b 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -2096,10 +2096,10 @@ void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
VisitExpr(E);
Record.push_back(E->getNumObjects());
for (auto &Obj : E->getObjects()) {
- if (auto *BD = Obj.dyn_cast<BlockDecl *>()) {
+ if (auto *BD = dyn_cast<BlockDecl *>(Obj)) {
Record.push_back(serialization::COK_Block);
Record.AddDeclRef(BD);
- } else if (auto *CLE = Obj.dyn_cast<CompoundLiteralExpr *>()) {
+ } else if (auto *CLE = dyn_cast<CompoundLiteralExpr *>(Obj)) {
Record.push_back(serialization::COK_CompoundLiteral);
Record.AddStmt(CLE);
}
diff --git a/clang/lib/Serialization/MultiOnDiskHashTable.h b/clang/lib/Serialization/MultiOnDiskHashTable.h
index a179016d47419..93193bb922461 100644
--- a/clang/lib/Serialization/MultiOnDiskHashTable.h
+++ b/clang/lib/Serialization/MultiOnDiskHashTable.h
@@ -110,8 +110,9 @@ template<typename Info> class MultiOnDiskHashTable {
MergedTable *getMergedTable() const {
// If we already have a merged table, it's the first one.
- return Tables.empty() ? nullptr : Table::getFromOpaqueValue(*Tables.begin())
- .template dyn_cast<MergedTable*>();
+ return Tables.empty() ? nullptr
+ : llvm::dyn_cast<MergedTable *>(
+ Table::getFromOpaqueValue(*Tables.begin()));
}
/// Delete all our current on-disk tables.
diff --git a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
index 6c1a55f79b908..eb3f437b28ed9 100644
--- a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp
@@ -257,7 +257,7 @@ preferTemplateDefinitionForTemplateSpecializations(const Decl *D) {
if (!InstantiatedFrom)
return D;
- if (const auto *Tmpl = InstantiatedFrom.dyn_cast<ClassTemplateDecl *>()) {
+ if (const auto *Tmpl = dyn_cast<ClassTemplateDecl *>(InstantiatedFrom)) {
// Interestingly, the source template might be a forward declaration, so we
// need to find the definition redeclaration.
return chooseDefinitionRedecl(walkInstantiatedFromChain(Tmpl));
diff --git a/clang/unittests/CodeGen/IRMatchers.h b/clang/unittests/CodeGen/IRMatchers.h
index 3572a317f07ac..afb12bac03e17 100644
--- a/clang/unittests/CodeGen/IRMatchers.h
+++ b/clang/unittests/CodeGen/IRMatchers.h
@@ -68,7 +68,7 @@ class MatcherContext {
template<typename T>
const T *get() const {
- return Entity.dyn_cast<const T *>();
+ return dyn_cast<const T *>(Entity);
}
unsigned getOperandNo() const { return OperandNo; }
``````````
</details>
https://github.com/llvm/llvm-project/pull/216354
More information about the cfe-commits
mailing list