-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[AST] Migrate away from PointerUnion::{is,get} (NFC) #119523
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
[AST] Migrate away from PointerUnion::{is,get} (NFC) #119523
Conversation
Note that PointerUnion::{is,get} have 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> I'm not touching PointerUnion::dyn_cast for now because it's a bit complicated; we could blindly migrate it to dyn_cast_if_present, but we should probably use dyn_cast when the operand is known to be non-null.
@llvm/pr-subscribers-clang Author: Kazu Hirata (kazutakahirata) ChangesNote that PointerUnion::{is,get} have been soft deprecated in // FIXME: Replace the uses of is(), get() and dyn_cast() with I'm not touching PointerUnion::dyn_cast for now because it's a bit Patch is 21.31 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/119523.diff 9 Files Affected:
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index 8c39ef3d5a9fa6..88d93a79d00f8f 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -747,9 +747,9 @@ class DeclaratorDecl : public ValueDecl {
/// ignoring outer template declarations.
SourceLocation InnerLocStart;
- bool hasExtInfo() const { return DeclInfo.is<ExtInfo*>(); }
- ExtInfo *getExtInfo() { return DeclInfo.get<ExtInfo*>(); }
- const ExtInfo *getExtInfo() const { return DeclInfo.get<ExtInfo*>(); }
+ bool hasExtInfo() const { return isa<ExtInfo *>(DeclInfo); }
+ ExtInfo *getExtInfo() { return cast<ExtInfo *>(DeclInfo); }
+ const ExtInfo *getExtInfo() const { return cast<ExtInfo *>(DeclInfo); }
protected:
DeclaratorDecl(Kind DK, DeclContext *DC, SourceLocation L,
@@ -762,9 +762,8 @@ class DeclaratorDecl : public ValueDecl {
friend class ASTDeclWriter;
TypeSourceInfo *getTypeSourceInfo() const {
- return hasExtInfo()
- ? getExtInfo()->TInfo
- : DeclInfo.get<TypeSourceInfo*>();
+ return hasExtInfo() ? getExtInfo()->TInfo
+ : cast<TypeSourceInfo *>(DeclInfo);
}
void setTypeSourceInfo(TypeSourceInfo *TI) {
@@ -3587,10 +3586,10 @@ class TagDecl : public TypeDecl,
/// otherwise, it is a null (TypedefNameDecl) pointer.
llvm::PointerUnion<TypedefNameDecl *, ExtInfo *> TypedefNameDeclOrQualifier;
- bool hasExtInfo() const { return TypedefNameDeclOrQualifier.is<ExtInfo *>(); }
- ExtInfo *getExtInfo() { return TypedefNameDeclOrQualifier.get<ExtInfo *>(); }
+ bool hasExtInfo() const { return isa<ExtInfo *>(TypedefNameDeclOrQualifier); }
+ ExtInfo *getExtInfo() { return cast<ExtInfo *>(TypedefNameDeclOrQualifier); }
const ExtInfo *getExtInfo() const {
- return TypedefNameDeclOrQualifier.get<ExtInfo *>();
+ return cast<ExtInfo *>(TypedefNameDeclOrQualifier);
}
protected:
@@ -3793,7 +3792,7 @@ class TagDecl : public TypeDecl,
TypedefNameDecl *getTypedefNameForAnonDecl() const {
return hasExtInfo() ? nullptr
- : TypedefNameDeclOrQualifier.get<TypedefNameDecl *>();
+ : cast<TypedefNameDecl *>(TypedefNameDeclOrQualifier);
}
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD);
@@ -4011,7 +4010,7 @@ class EnumDecl : public TagDecl {
return QualType();
if (const Type *T = IntegerType.dyn_cast<const Type*>())
return QualType(T, 0);
- return IntegerType.get<TypeSourceInfo*>()->getType().getUnqualifiedType();
+ return cast<TypeSourceInfo *>(IntegerType)->getType().getUnqualifiedType();
}
/// Set the underlying integer type.
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index a3447d19909752..82932e098c86f0 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -271,16 +271,12 @@ class alignas(8) Decl {
/// // LexicalDC == global namespace
llvm::PointerUnion<DeclContext*, MultipleDC*> DeclCtx;
- bool isInSemaDC() const { return DeclCtx.is<DeclContext*>(); }
- bool isOutOfSemaDC() const { return DeclCtx.is<MultipleDC*>(); }
+ bool isInSemaDC() const { return isa<DeclContext *>(DeclCtx); }
+ bool isOutOfSemaDC() const { return isa<MultipleDC *>(DeclCtx); }
- MultipleDC *getMultipleDC() const {
- return DeclCtx.get<MultipleDC*>();
- }
+ MultipleDC *getMultipleDC() const { return cast<MultipleDC *>(DeclCtx); }
- DeclContext *getSemanticDC() const {
- return DeclCtx.get<DeclContext*>();
- }
+ DeclContext *getSemanticDC() const { return cast<DeclContext *>(DeclCtx); }
/// Loc - The location of this decl.
SourceLocation Loc;
@@ -1340,7 +1336,7 @@ class DeclListNode {
assert(Ptr && "dereferencing end() iterator");
if (DeclListNode *CurNode = Ptr.dyn_cast<DeclListNode*>())
return CurNode->D;
- return Ptr.get<NamedDecl*>();
+ return cast<NamedDecl *>(Ptr);
}
void operator->() const { } // Unsupported.
bool operator==(const iterator &X) const { return Ptr == X.Ptr; }
diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h
index e389b5cd6df5b9..c232556edeff70 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -2388,19 +2388,19 @@ class CXXCtorInitializer final {
/// Determine whether this initializer is initializing a base class.
bool isBaseInitializer() const {
- return Initializee.is<TypeSourceInfo*>() && !IsDelegating;
+ return isa<TypeSourceInfo *>(Initializee) && !IsDelegating;
}
/// Determine whether this initializer is initializing a non-static
/// data member.
- bool isMemberInitializer() const { return Initializee.is<FieldDecl*>(); }
+ bool isMemberInitializer() const { return isa<FieldDecl *>(Initializee); }
bool isAnyMemberInitializer() const {
return isMemberInitializer() || isIndirectMemberInitializer();
}
bool isIndirectMemberInitializer() const {
- return Initializee.is<IndirectFieldDecl*>();
+ return isa<IndirectFieldDecl *>(Initializee);
}
/// Determine whether this initializer is an implicit initializer
@@ -2416,7 +2416,7 @@ class CXXCtorInitializer final {
/// Determine whether this initializer is creating a delegating
/// constructor.
bool isDelegatingInitializer() const {
- return Initializee.is<TypeSourceInfo*>() && IsDelegating;
+ return isa<TypeSourceInfo *>(Initializee) && IsDelegating;
}
/// Determine whether this initializer is a pack expansion.
@@ -2457,21 +2457,21 @@ class CXXCtorInitializer final {
/// non-static data member being initialized. Otherwise, returns null.
FieldDecl *getMember() const {
if (isMemberInitializer())
- return Initializee.get<FieldDecl*>();
+ return cast<FieldDecl *>(Initializee);
return nullptr;
}
FieldDecl *getAnyMember() const {
if (isMemberInitializer())
- return Initializee.get<FieldDecl*>();
+ return cast<FieldDecl *>(Initializee);
if (isIndirectMemberInitializer())
- return Initializee.get<IndirectFieldDecl*>()->getAnonField();
+ return cast<IndirectFieldDecl *>(Initializee)->getAnonField();
return nullptr;
}
IndirectFieldDecl *getIndirectMember() const {
if (isIndirectMemberInitializer())
- return Initializee.get<IndirectFieldDecl*>();
+ return cast<IndirectFieldDecl *>(Initializee);
return nullptr;
}
diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h
index dd92d40b804232..44ccf8932a1830 100644
--- a/clang/include/clang/AST/DeclTemplate.h
+++ b/clang/include/clang/AST/DeclTemplate.h
@@ -1965,7 +1965,7 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
return PartialSpec->PartialSpecialization;
- return SpecializedTemplate.get<ClassTemplateDecl*>();
+ return cast<ClassTemplateDecl *>(SpecializedTemplate);
}
/// Retrieve the set of template arguments that should be used
@@ -2013,7 +2013,7 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
if (auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>())
return Info->TemplateArgsAsWritten;
- return ExplicitInfo.get<const ASTTemplateArgumentListInfo *>();
+ return cast<const ASTTemplateArgumentListInfo *>(ExplicitInfo);
}
/// Set the template argument list as written in the sources.
@@ -2734,7 +2734,7 @@ class VarTemplateSpecializationDecl : public VarDecl,
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
return PartialSpec->PartialSpecialization;
- return SpecializedTemplate.get<VarTemplateDecl *>();
+ return cast<VarTemplateDecl *>(SpecializedTemplate);
}
/// Retrieve the set of template arguments that should be used
@@ -2782,7 +2782,7 @@ class VarTemplateSpecializationDecl : public VarDecl,
const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
if (auto *Info = ExplicitInfo.dyn_cast<ExplicitInstantiationInfo *>())
return Info->TemplateArgsAsWritten;
- return ExplicitInfo.get<const ASTTemplateArgumentListInfo *>();
+ return cast<const ASTTemplateArgumentListInfo *>(ExplicitInfo);
}
/// Set the template argument list as written in the sources.
@@ -3309,7 +3309,7 @@ inline NamedDecl *getAsNamedDecl(TemplateParameter P) {
return PD;
if (auto *PD = P.dyn_cast<NonTypeTemplateParmDecl *>())
return PD;
- return P.get<TemplateTemplateParmDecl *>();
+ return cast<TemplateTemplateParmDecl *>(P);
}
inline TemplateDecl *getAsTypeTemplateDecl(Decl *D) {
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 1a24b8857674ca..4cec89c979f775 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -878,7 +878,7 @@ class CXXTypeidExpr : public Expr {
/// object. This is not a strong guarantee.
bool isMostDerived(const ASTContext &Context) const;
- bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
+ bool isTypeOperand() const { return isa<TypeSourceInfo *>(Operand); }
/// Retrieves the type operand of this typeid() expression after
/// various required adjustments (removing reference types, cv-qualifiers).
@@ -887,11 +887,11 @@ class CXXTypeidExpr : public Expr {
/// Retrieve source information for the type operand.
TypeSourceInfo *getTypeOperandSourceInfo() const {
assert(isTypeOperand() && "Cannot call getTypeOperand for typeid(expr)");
- return Operand.get<TypeSourceInfo *>();
+ return cast<TypeSourceInfo *>(Operand);
}
Expr *getExprOperand() const {
assert(!isTypeOperand() && "Cannot call getExprOperand for typeid(type)");
- return static_cast<Expr*>(Operand.get<Stmt *>());
+ return static_cast<Expr *>(cast<Stmt *>(Operand));
}
SourceLocation getBeginLoc() const LLVM_READONLY { return Range.getBegin(); }
@@ -1093,7 +1093,7 @@ class CXXUuidofExpr : public Expr {
Operand = (TypeSourceInfo*)nullptr;
}
- bool isTypeOperand() const { return Operand.is<TypeSourceInfo *>(); }
+ bool isTypeOperand() const { return isa<TypeSourceInfo *>(Operand); }
/// Retrieves the type operand of this __uuidof() expression after
/// various required adjustments (removing reference types, cv-qualifiers).
@@ -1102,11 +1102,11 @@ class CXXUuidofExpr : public Expr {
/// Retrieve source information for the type operand.
TypeSourceInfo *getTypeOperandSourceInfo() const {
assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
- return Operand.get<TypeSourceInfo *>();
+ return cast<TypeSourceInfo *>(Operand);
}
Expr *getExprOperand() const {
assert(!isTypeOperand() && "Cannot call getExprOperand for __uuidof(type)");
- return static_cast<Expr*>(Operand.get<Stmt *>());
+ return static_cast<Expr *>(cast<Stmt *>(Operand));
}
MSGuidDecl *getGuidDecl() const { return Guid; }
@@ -4750,24 +4750,24 @@ class MaterializeTemporaryExpr : public Expr {
/// be materialized into a glvalue.
Expr *getSubExpr() const {
return cast<Expr>(
- State.is<Stmt *>()
- ? State.get<Stmt *>()
- : State.get<LifetimeExtendedTemporaryDecl *>()->getTemporaryExpr());
+ isa<Stmt *>(State)
+ ? cast<Stmt *>(State)
+ : cast<LifetimeExtendedTemporaryDecl *>(State)->getTemporaryExpr());
}
/// Retrieve the storage duration for the materialized temporary.
StorageDuration getStorageDuration() const {
- return State.is<Stmt *>() ? SD_FullExpression
- : State.get<LifetimeExtendedTemporaryDecl *>()
+ return isa<Stmt *>(State) ? SD_FullExpression
+ : cast<LifetimeExtendedTemporaryDecl *>(State)
->getStorageDuration();
}
/// Get the storage for the constant value of a materialized temporary
/// of static storage duration.
APValue *getOrCreateValue(bool MayCreate) const {
- assert(State.is<LifetimeExtendedTemporaryDecl *>() &&
+ assert(isa<LifetimeExtendedTemporaryDecl *>(State) &&
"the temporary has not been lifetime extended");
- return State.get<LifetimeExtendedTemporaryDecl *>()->getOrCreateValue(
+ return cast<LifetimeExtendedTemporaryDecl *>(State)->getOrCreateValue(
MayCreate);
}
@@ -4782,8 +4782,8 @@ class MaterializeTemporaryExpr : public Expr {
/// Get the declaration which triggered the lifetime-extension of this
/// temporary, if any.
ValueDecl *getExtendingDecl() {
- return State.is<Stmt *>() ? nullptr
- : State.get<LifetimeExtendedTemporaryDecl *>()
+ return isa<Stmt *>(State) ? nullptr
+ : cast<LifetimeExtendedTemporaryDecl *>(State)
->getExtendingDecl();
}
const ValueDecl *getExtendingDecl() const {
@@ -4793,8 +4793,8 @@ class MaterializeTemporaryExpr : public Expr {
void setExtendingDecl(ValueDecl *ExtendedBy, unsigned ManglingNumber);
unsigned getManglingNumber() const {
- return State.is<Stmt *>() ? 0
- : State.get<LifetimeExtendedTemporaryDecl *>()
+ return isa<Stmt *>(State) ? 0
+ : cast<LifetimeExtendedTemporaryDecl *>(State)
->getManglingNumber();
}
@@ -4820,17 +4820,17 @@ class MaterializeTemporaryExpr : public Expr {
// Iterators
child_range children() {
- return State.is<Stmt *>()
+ return isa<Stmt *>(State)
? child_range(State.getAddrOfPtr1(), State.getAddrOfPtr1() + 1)
- : State.get<LifetimeExtendedTemporaryDecl *>()->childrenExpr();
+ : cast<LifetimeExtendedTemporaryDecl *>(State)->childrenExpr();
}
const_child_range children() const {
- return State.is<Stmt *>()
+ return isa<Stmt *>(State)
? const_child_range(State.getAddrOfPtr1(),
State.getAddrOfPtr1() + 1)
: const_cast<const LifetimeExtendedTemporaryDecl *>(
- State.get<LifetimeExtendedTemporaryDecl *>())
+ cast<LifetimeExtendedTemporaryDecl *>(State))
->childrenExpr();
}
};
diff --git a/clang/include/clang/AST/ExprConcepts.h b/clang/include/clang/AST/ExprConcepts.h
index f3e32ce3961981..86c4155b6a853e 100644
--- a/clang/include/clang/AST/ExprConcepts.h
+++ b/clang/include/clang/AST/ExprConcepts.h
@@ -261,13 +261,13 @@ class TypeRequirement : public Requirement {
assert(Status == SS_SubstitutionFailure &&
"Attempted to get substitution diagnostic when there has been no "
"substitution failure.");
- return Value.get<SubstitutionDiagnostic *>();
+ return cast<SubstitutionDiagnostic *>(Value);
}
TypeSourceInfo *getType() const {
assert(!isSubstitutionFailure() &&
"Attempted to get type when there has been a substitution failure.");
- return Value.get<TypeSourceInfo *>();
+ return cast<TypeSourceInfo *>(Value);
}
static bool classof(const Requirement *R) {
@@ -409,14 +409,14 @@ class ExprRequirement : public Requirement {
assert(isExprSubstitutionFailure() &&
"Attempted to get expression substitution diagnostic when there has "
"been no expression substitution failure");
- return Value.get<SubstitutionDiagnostic *>();
+ return cast<SubstitutionDiagnostic *>(Value);
}
Expr *getExpr() const {
assert(!isExprSubstitutionFailure() &&
"ExprRequirement has no expression because there has been a "
"substitution failure.");
- return Value.get<Expr *>();
+ return cast<Expr *>(Value);
}
static bool classof(const Requirement *R) {
diff --git a/clang/include/clang/AST/ExprObjC.h b/clang/include/clang/AST/ExprObjC.h
index f833916c91aa54..1fccc260695820 100644
--- a/clang/include/clang/AST/ExprObjC.h
+++ b/clang/include/clang/AST/ExprObjC.h
@@ -752,28 +752,24 @@ class ObjCPropertyRefExpr : public Expr {
setMethodRefFlag(MethodRef_Setter, val);
}
- const Expr *getBase() const {
- return cast<Expr>(Receiver.get<Stmt*>());
- }
- Expr *getBase() {
- return cast<Expr>(Receiver.get<Stmt*>());
- }
+ const Expr *getBase() const { return cast<Expr>(cast<Stmt *>(Receiver)); }
+ Expr *getBase() { return cast<Expr>(cast<Stmt *>(Receiver)); }
SourceLocation getLocation() const { return IdLoc; }
SourceLocation getReceiverLocation() const { return ReceiverLoc; }
QualType getSuperReceiverType() const {
- return QualType(Receiver.get<const Type*>(), 0);
+ return QualType(cast<const Type *>(Receiver), 0);
}
ObjCInterfaceDecl *getClassReceiver() const {
- return Receiver.get<ObjCInterfaceDecl*>();
+ return cast<ObjCInterfaceDecl *>(Receiver);
}
- bool isObjectReceiver() const { return Receiver.is<Stmt*>(); }
- bool isSuperReceiver() const { return Receiver.is<const Type*>(); }
- bool isClassReceiver() const { return Receiver.is<ObjCInterfaceDecl*>(); }
+ bool isObjectReceiver() const { return isa<Stmt *>(Receiver); }
+ bool isSuperReceiver() const { return isa<const Type *>(Receiver); }
+ bool isClassReceiver() const { return isa<ObjCInterfaceDecl *>(Receiver); }
/// Determine the type of the base, regardless of the kind of receiver.
QualType getReceiverType(const ASTContext &ctx) const;
@@ -787,7 +783,7 @@ class ObjCPropertyRefExpr : public Expr {
// Iterators
child_range children() {
- if (Receiver.is<Stmt*>()) {
+ if (isa<Stmt *>(Receiver)) {
Stmt **begin = reinterpret_cast<Stmt**>(&Receiver); // hack!
return child_range(begin, begin+1);
}
diff --git a/clang/include/clang/AST/Redeclarable.h b/clang/include/clang/AST/Redeclarable.h
index 8d320a9ced2792..bba789375cb6ed 100644
--- a/clang/include/clang/AST/Redeclarable.h
+++ b/clang/include/clang/AST/Redeclarable.h
@@ -113,25 +113,24 @@ class Redeclarable {
DeclLink(PreviousTag, decl_type *D) : Link(NotKnownLatest(Previous(D))) {}
bool isFirst() const {
- return Link.is<KnownLatest>() ||
+ return isa<KnownLatest>(Link) ||
// FIXME: 'template' is required on the next line due to an
// apparent clang bug.
- Link.get<NotKnownLatest>().template is<UninitializedLatest>();
+ cast<NotKnownLatest>(Link).template is<UninitializedLatest>();
}
decl_type *getPrevious(const decl_type *D) const {
- if (Link.is<NotKnownLatest>()) {
- NotKnownLatest NKL = Link.get<NotKnownLatest>();
- if (NKL.is<Previous>())
- return static_cast<decl_type*>(NKL.get<Previous>());
+ if (NotKnownLatest NKL = dyn_cast<NotKnownLatest>(Link)) {
+ if (auto *Prev = dyn_cast<Previous>(NKL))
+ return static_cast<decl_type *>(Prev);
// Allocate the generational 'most recent' cache now, if needed.
Link = KnownLatest(*reinterpret_cast<const ASTContext *>(
- NKL.get<UninitializedLatest>()),
+ cast<UninitializedLatest>(NKL)),
const_cast<decl_type *>(D));
}
- return static_cast<decl_type*>(Link.get<KnownLatest>().get(D));
+ return static_cast<decl_type *>(cast<KnownLatest>(Link).get(D));
}
void setPrevious(decl_type *D) {
@@ -141,25 +140,24 @@ class Redeclarable {
void setLatest(decl_type *D) {
assert(isFirst() && "decl became canonical unexpectedly");
- if (Link.is<NotKnownLatest>()) {
- NotKnownLatest NKL = Link.get<NotKnownLatest>();
+ if (NotKnownLatest NKL = dyn_cast<NotKnownLatest>(Link)) {
Link = KnownLatest(*reinterpret_cast<const ASTContext *>(
- NKL.get<UninitializedLatest>()),
+ cast<UninitializedLatest>(NKL)),
D);
} else {
- auto Latest = Link.get<KnownLatest>();
+ auto Latest = cast<KnownLatest>(Link);
Latest.set(D);
Link = Latest;
}
}
- void markIncomplete() { Link.get<KnownLatest>().markIncomplete(); }
+ void markIncomplete()...
[truncated]
|
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.
LGTM
It looks like this somehow negatively affects stage2 clang performance: https://llvm-compile-time-tracker.com/compare.php?from=00e1cc4c9d002c78cf890b630343b052ebca0399&to=624cc7048f604ed1087f63fdbe4cbf40f1d35b69&stat=instructions:u |
Note that PointerUnion::{is,get} have been soft deprecated in
PointerUnion.h:
// FIXME: Replace the uses of is(), get() and dyn_cast() with
// isa, cast and the llvm::dyn_cast
I'm not touching PointerUnion::dyn_cast for now because it's a bit
complicated; we could blindly migrate it to dyn_cast_if_present, but
we should probably use dyn_cast when the operand is known to be
non-null.