Skip to content

[clang] Migrate away from PointerUnion::dyn_cast (NFC) #124425

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

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions clang/include/clang/AST/APValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/AST/ASTContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/AST/Decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/AST/DeclBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -1391,7 +1391,7 @@ 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 isa_and_present<NamedDecl *>(Result); }
reference front() const { return *begin(); }

// Find the first declaration of the given type in the list. Note that this
Expand Down
9 changes: 6 additions & 3 deletions clang/include/clang/AST/DeclTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Copy link
Contributor

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?

Copy link
Contributor Author

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().

Copy link
Contributor

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.

return Info->TemplateArgsAsWritten;
return cast<const ASTTemplateArgumentListInfo *>(ExplicitInfo);
}
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions clang/include/clang/AST/Expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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();
Expand Down
6 changes: 3 additions & 3 deletions clang/include/clang/AST/ExprCXX.h
Original file line number Diff line number Diff line change
Expand Up @@ -5026,19 +5026,19 @@ 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) {
ArrayFillerOrUnionFieldInit = FD;
}

FieldDecl *getInitializedFieldInUnion() {
return ArrayFillerOrUnionFieldInit.dyn_cast<FieldDecl *>();
return dyn_cast_if_present<FieldDecl *>(ArrayFillerOrUnionFieldInit);
}

const FieldDecl *getInitializedFieldInUnion() const {
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Basic/IdentifierTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
10 changes: 5 additions & 5 deletions clang/include/clang/Lex/Preprocessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar for this one.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my comment above.

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;
Expand Down Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/APINotes/APINotesManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down
71 changes: 37 additions & 34 deletions clang/lib/AST/Decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand All @@ -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(
Expand Down Expand Up @@ -4181,40 +4181,40 @@ 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;
}

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;
}

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;
Expand All @@ -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);
}
Expand All @@ -4256,8 +4257,8 @@ void FunctionDecl::setDependentTemplateSpecialization(

DependentFunctionTemplateSpecializationInfo *
FunctionDecl::getDependentSpecializationInfo() const {
return TemplateOrSpecialization
.dyn_cast<DependentFunctionTemplateSpecializationInfo *>();
return dyn_cast_if_present<DependentFunctionTemplateSpecializationInfo *>(
TemplateOrSpecialization);
}

DependentFunctionTemplateSpecializationInfo *
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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 *>(
Expand Down
Loading
Loading