-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang] Migrate away from PointerUnion::dyn_cast (NFC) #124425
[clang] Migrate away from PointerUnion::dyn_cast (NFC) #124425
Conversation
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> This patch migrates uses of PointerUnion::dyn_cast to dyn_cast_if_present (see the definition of PointerUnion::dyn_cast). Note that we cannot use dyn_cast in any of the migrations in this patch; placing assert(!X.isNull()); just before any of dyn_cast_if_present in this patch triggers some failure in check-clang.
@llvm/pr-subscribers-clang Author: Kazu Hirata (kazutakahirata) ChangesNote that PointerUnion::dyn_cast has been soft deprecated in // FIXME: Replace the uses of is(), get() and dyn_cast() with This patch migrates uses of PointerUnion::dyn_cast to assert(!X.isNull()); just before any of dyn_cast_if_present in this patch triggers some Patch is 24.93 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/124425.diff 17 Files Affected:
diff --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h
index 833a78c77871d0..9999a30c51ade4 100644
--- a/clang/include/clang/AST/APValue.h
+++ b/clang/include/clang/AST/APValue.h
@@ -161,8 +161,9 @@ class APValue {
template <class T> T get() const { return cast<T>(Ptr); }
- template <class T>
- T dyn_cast() const { return Ptr.dyn_cast<T>(); }
+ template <class T> T dyn_cast() const {
+ return dyn_cast_if_present<T>(Ptr);
+ }
void *getOpaqueValue() const;
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h
index 4e9b961688d559..65be782c1ba43e 100644
--- a/clang/include/clang/AST/ASTContext.h
+++ b/clang/include/clang/AST/ASTContext.h
@@ -769,7 +769,7 @@ class ASTContext : public RefCountedBase<ASTContext> {
/// pool.
DeclListNode *AllocateDeclListNode(clang::NamedDecl *ND) {
if (DeclListNode *Alloc = ListNodeFreeList) {
- ListNodeFreeList = Alloc->Rest.dyn_cast<DeclListNode*>();
+ ListNodeFreeList = dyn_cast_if_present<DeclListNode *>(Alloc->Rest);
Alloc->D = ND;
Alloc->Rest = nullptr;
return Alloc;
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index d01681483a9189..16403774e72b31 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -4035,7 +4035,7 @@ class EnumDecl : public TagDecl {
/// Return the type source info for the underlying integer type,
/// if no type source info exists, return 0.
TypeSourceInfo *getIntegerTypeSourceInfo() const {
- return IntegerType.dyn_cast<TypeSourceInfo*>();
+ return dyn_cast_if_present<TypeSourceInfo *>(IntegerType);
}
/// Retrieve the source range that covers the underlying type if
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index 573b46a2321c5f..6074e0aee06161 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -1391,7 +1391,9 @@ class DeclContextLookupResult {
const_iterator end() const { return iterator(); }
bool empty() const { return Result.isNull(); }
- bool isSingleResult() const { return Result.dyn_cast<NamedDecl*>(); }
+ bool isSingleResult() const {
+ return dyn_cast_if_present<NamedDecl *>(Result);
+ }
reference front() const { return *begin(); }
// Find the first declaration of the given type in the list. Note that this
diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h
index 8c2da97c07a3bf..caaa47d0a297cf 100644
--- a/clang/include/clang/AST/DeclTemplate.h
+++ b/clang/include/clang/AST/DeclTemplate.h
@@ -2009,7 +2009,8 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
/// Retrieve the template argument list as written in the sources,
/// if any.
const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
- if (auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>())
+ if (auto *Info =
+ dyn_cast_if_present<ExplicitInstantiationInfo *>(ExplicitInfo))
return Info->TemplateArgsAsWritten;
return cast<const ASTTemplateArgumentListInfo *>(ExplicitInfo);
}
@@ -2041,7 +2042,8 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
/// Gets the location of the template keyword, if present.
SourceLocation getTemplateKeywordLoc() const {
- if (auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>())
+ if (auto *Info =
+ dyn_cast_if_present<ExplicitInstantiationInfo *>(ExplicitInfo))
return Info->TemplateKeywordLoc;
return SourceLocation();
}
@@ -2786,7 +2788,8 @@ class VarTemplateSpecializationDecl : public VarDecl,
/// Set the template argument list as written in the sources.
void
setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten) {
- if (auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>())
+ if (auto *Info =
+ dyn_cast_if_present<ExplicitInstantiationInfo *>(ExplicitInfo))
Info->TemplateArgsAsWritten = ArgsWritten;
else
ExplicitInfo = ArgsWritten;
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 708c8656decbe0..7be4022649329b 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -5180,7 +5180,7 @@ class InitListExpr : public Expr {
/// than there are initializers in the list, specifies an expression to be
/// used for value initialization of the rest of the elements.
Expr *getArrayFiller() {
- return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
+ return dyn_cast_if_present<Expr *>(ArrayFillerOrUnionFieldInit);
}
const Expr *getArrayFiller() const {
return const_cast<InitListExpr *>(this)->getArrayFiller();
@@ -5205,7 +5205,7 @@ class InitListExpr : public Expr {
/// union. However, a designated initializer can specify the
/// initialization of a different field within the union.
FieldDecl *getInitializedFieldInUnion() {
- return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
+ return dyn_cast_if_present<FieldDecl *>(ArrayFillerOrUnionFieldInit);
}
const FieldDecl *getInitializedFieldInUnion() const {
return const_cast<InitListExpr *>(this)->getInitializedFieldInUnion();
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 4cec89c979f775..aa10945addf78f 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -5026,11 +5026,11 @@ class CXXParenListInitExpr final
void setArrayFiller(Expr *E) { ArrayFillerOrUnionFieldInit = E; }
Expr *getArrayFiller() {
- return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
+ return dyn_cast_if_present<Expr *>(ArrayFillerOrUnionFieldInit);
}
const Expr *getArrayFiller() const {
- return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
+ return dyn_cast_if_present<Expr *>(ArrayFillerOrUnionFieldInit);
}
void setInitializedFieldInUnion(FieldDecl *FD) {
@@ -5038,7 +5038,7 @@ class CXXParenListInitExpr final
}
FieldDecl *getInitializedFieldInUnion() {
- return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
+ return dyn_cast_if_present<FieldDecl *>(ArrayFillerOrUnionFieldInit);
}
const FieldDecl *getInitializedFieldInUnion() const {
diff --git a/clang/include/clang/Basic/IdentifierTable.h b/clang/include/clang/Basic/IdentifierTable.h
index 33d1cdb46f108b..e5e6be3c966003 100644
--- a/clang/include/clang/Basic/IdentifierTable.h
+++ b/clang/include/clang/Basic/IdentifierTable.h
@@ -1008,7 +1008,7 @@ class Selector {
}
const IdentifierInfo *getAsIdentifierInfo() const {
- return InfoPtr.getPointer().dyn_cast<const IdentifierInfo *>();
+ return dyn_cast_if_present<const IdentifierInfo *>(InfoPtr.getPointer());
}
MultiKeywordSelector *getMultiKeywordSelector() const {
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h
index 8ddc5b56eedbd4..416f403c298410 100644
--- a/clang/include/clang/Lex/Preprocessor.h
+++ b/clang/include/clang/Lex/Preprocessor.h
@@ -856,7 +856,7 @@ class Preprocessor {
!PP.CurSubmoduleState->VisibleModules.getGeneration())
return nullptr;
- auto *Info = State.dyn_cast<ModuleMacroInfo*>();
+ auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State);
if (!Info) {
Info = new (PP.getPreprocessorAllocator())
ModuleMacroInfo(cast<MacroDirective *>(State));
@@ -885,18 +885,18 @@ class Preprocessor {
}
~MacroState() {
- if (auto *Info = State.dyn_cast<ModuleMacroInfo*>())
+ if (auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
Info->~ModuleMacroInfo();
}
MacroDirective *getLatest() const {
- if (auto *Info = State.dyn_cast<ModuleMacroInfo*>())
+ if (auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
return Info->MD;
return cast<MacroDirective *>(State);
}
void setLatest(MacroDirective *MD) {
- if (auto *Info = State.dyn_cast<ModuleMacroInfo*>())
+ if (auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State))
Info->MD = MD;
else
State = MD;
@@ -940,7 +940,7 @@ class Preprocessor {
void setOverriddenMacros(Preprocessor &PP,
ArrayRef<ModuleMacro *> Overrides) {
- auto *Info = State.dyn_cast<ModuleMacroInfo*>();
+ auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State);
if (!Info) {
if (Overrides.empty())
return;
diff --git a/clang/lib/APINotes/APINotesManager.cpp b/clang/lib/APINotes/APINotesManager.cpp
index 70d96c735503fd..7f8a126ffaa03a 100644
--- a/clang/lib/APINotes/APINotesManager.cpp
+++ b/clang/lib/APINotes/APINotesManager.cpp
@@ -56,7 +56,7 @@ APINotesManager::APINotesManager(SourceManager &SM, const LangOptions &LangOpts)
APINotesManager::~APINotesManager() {
// Free the API notes readers.
for (const auto &Entry : Readers) {
- if (auto Reader = Entry.second.dyn_cast<APINotesReader *>())
+ if (auto Reader = dyn_cast_if_present<APINotesReader *>(Entry.second))
delete Reader;
}
@@ -381,7 +381,7 @@ APINotesManager::findAPINotes(SourceLocation Loc) {
}
// We have the answer.
- if (auto Reader = Known->second.dyn_cast<APINotesReader *>())
+ if (auto Reader = dyn_cast_if_present<APINotesReader *>(Known->second))
Results.push_back(Reader);
break;
}
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 5ce03ce20d2841..74bcb618f2950f 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -2447,7 +2447,7 @@ bool VarDecl::isOutOfLine() const {
}
void VarDecl::setInit(Expr *I) {
- if (auto *Eval = Init.dyn_cast<EvaluatedStmt *>()) {
+ if (auto *Eval = dyn_cast_if_present<EvaluatedStmt *>(Init)) {
Eval->~EvaluatedStmt();
getASTContext().Deallocate(Eval);
}
@@ -2527,7 +2527,7 @@ bool VarDecl::isUsableInConstantExpressions(const ASTContext &Context) const {
/// form, which contains extra information on the evaluated value of the
/// initializer.
EvaluatedStmt *VarDecl::ensureEvaluatedStmt() const {
- auto *Eval = Init.dyn_cast<EvaluatedStmt *>();
+ auto *Eval = dyn_cast_if_present<EvaluatedStmt *>(Init);
if (!Eval) {
// Note: EvaluatedStmt contains an APValue, which usually holds
// resources not allocated from the ASTContext. We need to do some
@@ -2541,7 +2541,7 @@ EvaluatedStmt *VarDecl::ensureEvaluatedStmt() const {
}
EvaluatedStmt *VarDecl::getEvaluatedStmt() const {
- return Init.dyn_cast<EvaluatedStmt *>();
+ return dyn_cast_if_present<EvaluatedStmt *>(Init);
}
APValue *VarDecl::evaluateValue() const {
@@ -2784,8 +2784,8 @@ SourceLocation VarDecl::getPointOfInstantiation() const {
}
VarTemplateDecl *VarDecl::getDescribedVarTemplate() const {
- return getASTContext().getTemplateOrSpecializationInfo(this)
- .dyn_cast<VarTemplateDecl *>();
+ return dyn_cast_if_present<VarTemplateDecl *>(
+ getASTContext().getTemplateOrSpecializationInfo(this));
}
void VarDecl::setDescribedVarTemplate(VarTemplateDecl *Template) {
@@ -2875,8 +2875,8 @@ MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() const {
if (isStaticDataMember())
// FIXME: Remove ?
// return getASTContext().getInstantiatedFromStaticDataMember(this);
- return getASTContext().getTemplateOrSpecializationInfo(this)
- .dyn_cast<MemberSpecializationInfo *>();
+ return dyn_cast_if_present<MemberSpecializationInfo *>(
+ getASTContext().getTemplateOrSpecializationInfo(this));
return nullptr;
}
@@ -4040,11 +4040,11 @@ FunctionDecl *FunctionDecl::getInstantiatedFromMemberFunction() const {
}
MemberSpecializationInfo *FunctionDecl::getMemberSpecializationInfo() const {
- if (auto *MSI =
- TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
+ if (auto *MSI = dyn_cast_if_present<MemberSpecializationInfo *>(
+ TemplateOrSpecialization))
return MSI;
- if (auto *FTSI = TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo *>())
+ if (auto *FTSI = dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization))
return FTSI->getMemberSpecializationInfo();
return nullptr;
}
@@ -4062,7 +4062,7 @@ FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C,
FunctionTemplateDecl *FunctionDecl::getDescribedFunctionTemplate() const {
return dyn_cast_if_present<FunctionTemplateDecl>(
- TemplateOrSpecialization.dyn_cast<NamedDecl *>());
+ dyn_cast_if_present<NamedDecl *>(TemplateOrSpecialization));
}
void FunctionDecl::setDescribedFunctionTemplate(
@@ -4181,9 +4181,9 @@ FunctionDecl::getTemplateInstantiationPattern(bool ForDefinition) const {
}
FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const {
- if (FunctionTemplateSpecializationInfo *Info
- = TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
+ if (FunctionTemplateSpecializationInfo *Info =
+ dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization)) {
return Info->getTemplate();
}
return nullptr;
@@ -4191,15 +4191,15 @@ FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const {
FunctionTemplateSpecializationInfo *
FunctionDecl::getTemplateSpecializationInfo() const {
- return TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo *>();
+ return dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization);
}
const TemplateArgumentList *
FunctionDecl::getTemplateSpecializationArgs() const {
- if (FunctionTemplateSpecializationInfo *Info
- = TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
+ if (FunctionTemplateSpecializationInfo *Info =
+ dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization)) {
return Info->TemplateArguments;
}
return nullptr;
@@ -4207,14 +4207,14 @@ FunctionDecl::getTemplateSpecializationArgs() const {
const ASTTemplateArgumentListInfo *
FunctionDecl::getTemplateSpecializationArgsAsWritten() const {
- if (FunctionTemplateSpecializationInfo *Info
- = TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
+ if (FunctionTemplateSpecializationInfo *Info =
+ dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization)) {
return Info->TemplateArgumentsAsWritten;
}
if (DependentFunctionTemplateSpecializationInfo *Info =
- TemplateOrSpecialization
- .dyn_cast<DependentFunctionTemplateSpecializationInfo *>()) {
+ dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization)) {
return Info->TemplateArgumentsAsWritten;
}
return nullptr;
@@ -4239,7 +4239,8 @@ void FunctionDecl::setFunctionTemplateSpecialization(
FunctionTemplateSpecializationInfo::Create(
C, this, Template, TSK, TemplateArgs, TemplateArgsAsWritten,
PointOfInstantiation,
- TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>());
+ dyn_cast_if_present<MemberSpecializationInfo *>(
+ TemplateOrSpecialization));
TemplateOrSpecialization = Info;
Template->addSpecialization(Info, InsertPos);
}
@@ -4256,8 +4257,8 @@ void FunctionDecl::setDependentTemplateSpecialization(
DependentFunctionTemplateSpecializationInfo *
FunctionDecl::getDependentSpecializationInfo() const {
- return TemplateOrSpecialization
- .dyn_cast<DependentFunctionTemplateSpecializationInfo *>();
+ return dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization);
}
DependentFunctionTemplateSpecializationInfo *
@@ -4288,12 +4289,13 @@ TemplateSpecializationKind FunctionDecl::getTemplateSpecializationKind() const {
// For a function template specialization, query the specialization
// information object.
if (FunctionTemplateSpecializationInfo *FTSInfo =
- TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo *>())
+ dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization))
return FTSInfo->getTemplateSpecializationKind();
if (MemberSpecializationInfo *MSInfo =
- TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
+ dyn_cast_if_present<MemberSpecializationInfo *>(
+ TemplateOrSpecialization))
return MSInfo->getTemplateSpecializationKind();
// A dependent function template specialization is an explicit specialization,
@@ -4331,15 +4333,16 @@ FunctionDecl::getTemplateSpecializationKindForInstantiation() const {
// of A<int>::f, and that A<int>::f<int> should be implicitly instantiated
// from A::f<int> if a definition is needed.
if (FunctionTemplateSpecializationInfo *FTSInfo =
- TemplateOrSpecialization
- .dyn_cast<FunctionTemplateSpecializationInfo *>()) {
+ dyn_cast_if_present<FunctionTemplateSpecializationInfo *>(
+ TemplateOrSpecialization)) {
if (auto *MSInfo = FTSInfo->getMemberSpecializationInfo())
return MSInfo->getTemplateSpecializationKind();
return FTSInfo->getTemplateSpecializationKind();
}
if (MemberSpecializationInfo *MSInfo =
- TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo *>())
+ dyn_cast_if_present<MemberSpecializationInfo *>(
+ TemplateOrSpecialization))
return MSInfo->getTemplateSpecializationKind();
if (isa<DependentFunctionTemplateSpecializationInfo *>(
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 44f45898fb483d..c0a4356dcb004f 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -1987,7 +1987,8 @@ CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
}
MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
- return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
+ return dyn_cast_if_present<MemberSpecializationInfo *>(
+ TemplateOrInstantiation);
}
void
@@ -2001,7 +2002,7 @@ CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
}
ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
- return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
+ return dyn_cast_if_present<ClassTemplateDecl *>(TemplateOrInstantiation);
}
void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
@@ -2045,7 +2046,7 @@ const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
// specialization from which it was instantiated.
if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
auto From = TD->getInstantiatedFrom();
- if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
+ if (auto *CTD = dyn_cast_if_present<ClassTemplateDecl *>(From)) {
while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
if (NewCTD->isMemberSpecialization())
break;
@@ -2054,7 +2055,8 @@ const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
return GetDefinitionOrSelf(CTD->getTemplatedDecl());
}
if (auto *CTPSD =
- From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
+ dyn_cast_if_present<ClassTemplatePartialSpecializationDecl *>(
+ From)) {
while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
if (NewCTPSD->isMemberSpecialization())
break;
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
index 2933ba7fb8a295..926b2b26dd381d 100644
--- a/clang/lib/AST/DeclTemplate.cpp
+++ b/clang/lib/AST/DeclTemplate.cpp
@@ -1077,7 +1077,7 @@ ClassTemplateSpecializationDecl::getSourceRange() const {
}
void ClassTemplateSpecializationDecl::setExternKeywordLoc(SourceLocation Loc) {
- auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>();
+ auto *Info = dyn_cast_if_present<ExplicitInstantiationInfo *>(ExplicitInfo);
if (!Info) {
// Don't allocate if the location is invalid.
if ...
[truncated]
|
@@ -2009,7 +2009,8 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl, | |||
/// Retrieve the template argument list as written in the sources, | |||
/// if any. | |||
const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const { | |||
if (auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>()) | |||
if (auto *Info = | |||
dyn_cast_if_present<ExplicitInstantiationInfo *>(ExplicitInfo)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a bit confused by this one. I'd have expected dyn_cast to work here, given the following cast. Or is this the weird case where cast on the non-first pointer union member accepts null?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also thought so, but surprisingly, cast<T *>(PU)
, where PU
satisfies PU.isNull()
, seems to work. I don't know if being "non-first" matters here.
For this reason, I'm migrating PU.dyn_cast<T *>()
to dyn_cast<T *>(PU)
if the if-then-else chain ends with some sort of dereference like *cast<U *>(PU)
or cast<U *>(PU)->foo()
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See #121847 for a related issue, though not sure it's exactly the same.
Info->~ModuleMacroInfo(); | ||
} | ||
|
||
MacroDirective *getLatest() const { | ||
if (auto *Info = State.dyn_cast<ModuleMacroInfo*>()) | ||
if (auto *Info = dyn_cast_if_present<ModuleMacroInfo *>(State)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar for this one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See my comment above.
Note that PointerUnion::dyn_cast has been soft deprecated in
PointerUnion.h:
// FIXME: Replace the uses of is(), get() and dyn_cast() with
// isa, cast and the llvm::dyn_cast
This patch migrates uses of PointerUnion::dyn_cast to
dyn_cast_if_present (see the definition of PointerUnion::dyn_cast).
Note that we cannot use dyn_cast in any of the migrations in this
patch; placing
assert(!X.isNull());
just before any of dyn_cast_if_present in this patch triggers some
failure in check-clang.