diff options
Diffstat (limited to 'contrib/llvm-project/clang/include/clang/AST/ASTTypeTraits.h')
-rw-r--r-- | contrib/llvm-project/clang/include/clang/AST/ASTTypeTraits.h | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/contrib/llvm-project/clang/include/clang/AST/ASTTypeTraits.h b/contrib/llvm-project/clang/include/clang/AST/ASTTypeTraits.h index 6d96146a4d45..3988a15971db 100644 --- a/contrib/llvm-project/clang/include/clang/AST/ASTTypeTraits.h +++ b/contrib/llvm-project/clang/include/clang/AST/ASTTypeTraits.h @@ -51,11 +51,10 @@ enum TraversalKind { class ASTNodeKind { public: /// Empty identifier. It matches nothing. - ASTNodeKind() : KindId(NKI_None) {} + constexpr ASTNodeKind() : KindId(NKI_None) {} /// Construct an identifier for T. - template <class T> - static ASTNodeKind getFromNodeKind() { + template <class T> static constexpr ASTNodeKind getFromNodeKind() { return ASTNodeKind(KindToKindId<T>::Id); } @@ -71,23 +70,26 @@ public: /// \} /// Returns \c true if \c this and \c Other represent the same kind. - bool isSame(ASTNodeKind Other) const { + constexpr bool isSame(ASTNodeKind Other) const { return KindId != NKI_None && KindId == Other.KindId; } /// Returns \c true only for the default \c ASTNodeKind() - bool isNone() const { return KindId == NKI_None; } + constexpr bool isNone() const { return KindId == NKI_None; } + + /// Returns \c true if \c this is a base kind of (or same as) \c Other. + bool isBaseOf(ASTNodeKind Other) const; /// Returns \c true if \c this is a base kind of (or same as) \c Other. /// \param Distance If non-null, used to return the distance between \c this /// and \c Other in the class hierarchy. - bool isBaseOf(ASTNodeKind Other, unsigned *Distance = nullptr) const; + bool isBaseOf(ASTNodeKind Other, unsigned *Distance) const; /// String representation of the kind. StringRef asStringRef() const; /// Strict weak ordering for ASTNodeKind. - bool operator<(const ASTNodeKind &Other) const { + constexpr bool operator<(const ASTNodeKind &Other) const { return KindId < Other.KindId; } @@ -121,7 +123,7 @@ public: /// Check if the given ASTNodeKind identifies a type that offers pointer /// identity. This is useful for the fast path in DynTypedNode. - bool hasPointerIdentity() const { + constexpr bool hasPointerIdentity() const { return KindId > NKI_LastKindWithoutPointerIdentity; } @@ -160,11 +162,17 @@ private: NKI_Attr, #define ATTR(A) NKI_##A##Attr, #include "clang/Basic/AttrList.inc" + NKI_ObjCProtocolLoc, + NKI_ConceptReference, NKI_NumberOfKinds }; /// Use getFromNodeKind<T>() to construct the kind. - ASTNodeKind(NodeKindId KindId) : KindId(KindId) {} + constexpr ASTNodeKind(NodeKindId KindId) : KindId(KindId) {} + + /// Returns \c true if \c Base is a base kind of (or same as) \c + /// Derived. + static bool isBaseOf(NodeKindId Base, NodeKindId Derived); /// Returns \c true if \c Base is a base kind of (or same as) \c /// Derived. @@ -213,7 +221,9 @@ KIND_TO_KIND_ID(Stmt) KIND_TO_KIND_ID(Type) KIND_TO_KIND_ID(OMPClause) KIND_TO_KIND_ID(Attr) +KIND_TO_KIND_ID(ObjCProtocolLoc) KIND_TO_KIND_ID(CXXBaseSpecifier) +KIND_TO_KIND_ID(ConceptReference) #define DECL(DERIVED, BASE) KIND_TO_KIND_ID(DERIVED##Decl) #include "clang/AST/DeclNodes.inc" #define STMT(DERIVED, BASE) KIND_TO_KIND_ID(DERIVED) @@ -499,7 +509,7 @@ private: /// have storage or unique pointers and thus need to be stored by value. llvm::AlignedCharArrayUnion<const void *, TemplateArgument, TemplateArgumentLoc, NestedNameSpecifierLoc, - QualType, TypeLoc> + QualType, TypeLoc, ObjCProtocolLoc> Storage; }; @@ -570,6 +580,14 @@ template <> struct DynTypedNode::BaseConverter<CXXBaseSpecifier, void> : public PtrConverter<CXXBaseSpecifier> {}; +template <> +struct DynTypedNode::BaseConverter<ObjCProtocolLoc, void> + : public ValueConverter<ObjCProtocolLoc> {}; + +template <> +struct DynTypedNode::BaseConverter<ConceptReference, void> + : public PtrConverter<ConceptReference> {}; + // The only operation we allow on unsupported types is \c get. // This allows to conveniently use \c DynTypedNode when having an arbitrary // AST node that is not supported, but prevents misuse - a user cannot create |