Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
4 changes: 3 additions & 1 deletion clang/include/clang/AST/DeclBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
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