15#ifndef LLVM_CLANG_AST_ASTTYPETRAITS_H
16#define LLVM_CLANG_AST_ASTTYPETRAITS_H
25#include "llvm/ADT/DenseMapInfo.h"
26#include "llvm/Support/AlignOf.h"
74 return KindId != NKI_None && KindId ==
Other.KindId;
78 constexpr bool isNone()
const {
return KindId == NKI_None; }
93 return KindId <
Other.KindId;
114 return LHS.KindId == RHS.KindId;
121 return KindId > NKI_LastKindWithoutPointerIdentity;
130 NKI_TemplateArgument,
131 NKI_TemplateArgumentLoc,
134 NKI_NestedNameSpecifier,
135 NKI_NestedNameSpecifierLoc,
137#define TYPELOC(CLASS, PARENT) NKI_##CLASS##TypeLoc,
138#include "clang/AST/TypeLocNodes.def"
140 NKI_LastKindWithoutPointerIdentity = NKI_TypeLoc,
141 NKI_CXXBaseSpecifier,
142 NKI_CXXCtorInitializer,
144#define DECL(DERIVED, BASE) NKI_##DERIVED##Decl,
145#include "clang/AST/DeclNodes.inc"
147#define STMT(DERIVED, BASE) NKI_##DERIVED,
148#include "clang/AST/StmtNodes.inc"
150#define TYPE(DERIVED, BASE) NKI_##DERIVED##Type,
151#include "clang/AST/TypeNodes.inc"
153#define GEN_CLANG_CLAUSE_CLASS
154#define CLAUSE_CLASS(Enum, Str, Class) NKI_##Class,
155#include "llvm/Frontend/OpenMP/OMP.inc"
157#define ATTR(A) NKI_##A##Attr,
158#include "clang/Basic/AttrList.inc"
160 NKI_ConceptReference,
166 constexpr ASTNodeKind(NodeKindId KindId) : KindId(KindId) {}
170 static bool isBaseOf(NodeKindId Base, NodeKindId Derived);
176 static bool isBaseOf(NodeKindId Base, NodeKindId Derived,
unsigned *Distance);
181 template <
class T>
struct KindToKindId {
182 static const NodeKindId Id = NKI_None;
185 struct KindToKindId<const
T> : KindToKindId<T> {};
194 static const KindInfo AllKindInfo[NKI_NumberOfKinds];
199#define KIND_TO_KIND_ID(Class) \
200 template <> struct ASTNodeKind::KindToKindId<Class> { \
201 static const NodeKindId Id = NKI_##Class; \
211#define TYPELOC(CLASS, PARENT) KIND_TO_KIND_ID(CLASS##TypeLoc)
212#include "clang/AST/TypeLocNodes.def"
223#define DECL(DERIVED, BASE) KIND_TO_KIND_ID(DERIVED##Decl)
224#include "clang/AST/DeclNodes.inc"
225#define STMT(DERIVED, BASE) KIND_TO_KIND_ID(DERIVED)
226#include "clang/AST/StmtNodes.inc"
227#define TYPE(DERIVED, BASE) KIND_TO_KIND_ID(DERIVED##Type)
228#include "clang/AST/TypeNodes.inc"
229#define GEN_CLANG_CLAUSE_CLASS
230#define CLAUSE_CLASS(Enum, Str, Class) KIND_TO_KIND_ID(Class)
231#include "llvm/Frontend/OpenMP/OMP.inc"
232#define ATTR(A) KIND_TO_KIND_ID(A##Attr)
233#include "clang/Basic/AttrList.inc"
234#undef KIND_TO_KIND_ID
256 template <
typename T>
258 return BaseConverter<T>::create(Node);
273 template <
typename T>
const T *
get()
const {
274 return BaseConverter<T>::get(NodeKind, &Storage);
280 template <
typename T>
282 return BaseConverter<T>::getUnchecked(NodeKind, &Storage);
293 return NodeKind.hasPointerIdentity()
294 ? *
reinterpret_cast<void *
const *
>(&Storage)
302 void dump(llvm::raw_ostream &OS,
const ASTContext &Context)
const;
314 if (!NodeKind.isSame(
Other.NodeKind))
315 return NodeKind <
Other.NodeKind;
324 return std::make_pair(TLA.getType().getAsOpaquePtr(),
325 TLA.getOpaqueData()) <
326 std::make_pair(TLB.getType().getAsOpaquePtr(),
327 TLB.getOpaqueData());
334 return std::make_pair(NNSLA.getNestedNameSpecifier().getAsVoidPointer(),
335 NNSLA.getOpaqueData()) <
336 std::make_pair(NNSLB.getNestedNameSpecifier().getAsVoidPointer(),
337 NNSLB.getOpaqueData());
350 if (!NodeKind.isSame(
Other.NodeKind))
382 return llvm::hash_combine(TL.getType().getAsOpaquePtr(),
389 return llvm::hash_combine(
390 NNSL.getNestedNameSpecifier().getAsVoidPointer(),
391 NNSL.getOpaqueData());
396 return llvm::DenseMapInfo<NestedNameSpecifier>::getHashValue(
409 template <
typename T,
typename EnablerT =
void>
struct BaseConverter;
412 template <
typename T,
typename BaseT>
struct DynCastPtrConverter {
418 static const T &
getUnchecked(ASTNodeKind NodeKind,
const void *Storage) {
420 return *
cast<T>(
static_cast<const BaseT *
>(
421 *
reinterpret_cast<const void *
const *
>(Storage)));
426 new (&
Result.Storage)
const void *(&Node);
432 template <
typename T>
struct PtrConverter {
433 static const T *
get(ASTNodeKind NodeKind,
const void *Storage) {
438 static const T &
getUnchecked(ASTNodeKind NodeKind,
const void *Storage) {
440 return *
static_cast<const T *
>(
441 *
reinterpret_cast<const void *
const *
>(
Storage));
446 new (&
Result.Storage)
const void *(&Node);
452 template <
typename T>
struct ValueConverter {
453 static const T *
get(ASTNodeKind NodeKind,
const void *Storage) {
455 return reinterpret_cast<const T *
>(
Storage);
458 static const T &
getUnchecked(ASTNodeKind NodeKind,
const void *Storage) {
460 return *
reinterpret_cast<const T *
>(
Storage);
473 template <
typename T,
typename BaseT,
474 typename = std::enable_if_t<(
sizeof(
T) ==
sizeof(BaseT))>>
475 struct DynCastValueConverter {
476 static const T *
get(ASTNodeKind NodeKind,
const void *Storage) {
481 static const T &
getUnchecked(ASTNodeKind NodeKind,
const void *Storage) {
483 return *
static_cast<const T *
>(
reinterpret_cast<const BaseT *
>(Storage));
493 ASTNodeKind NodeKind;
504 llvm::AlignedCharArrayUnion<
505 const void *, TemplateArgument, TemplateArgumentLoc, NestedNameSpecifier,
506 NestedNameSpecifierLoc, QualType, TypeLoc, ObjCProtocolLoc>
511struct DynTypedNode::BaseConverter<
512 T, std::enable_if_t<std::is_base_of<Decl, T>::value>>
513 :
public DynCastPtrConverter<T, Decl> {};
516struct DynTypedNode::BaseConverter<
517 T,
std::enable_if_t<std::is_base_of<Stmt, T>::value>>
518 :
public DynCastPtrConverter<T, Stmt> {};
521struct DynTypedNode::BaseConverter<
522 T,
std::enable_if_t<std::is_base_of<Type, T>::value>>
523 :
public DynCastPtrConverter<T, Type> {};
526struct DynTypedNode::BaseConverter<
527 T,
std::enable_if_t<std::is_base_of<OMPClause, T>::value>>
528 :
public DynCastPtrConverter<T, OMPClause> {};
531struct DynTypedNode::BaseConverter<
532 T,
std::enable_if_t<std::is_base_of<Attr, T>::value>>
533 :
public DynCastPtrConverter<T, Attr> {};
537 :
public ValueConverter<NestedNameSpecifier> {};
540struct DynTypedNode::BaseConverter<
544struct DynTypedNode::BaseConverter<
549 :
public ValueConverter<TemplateArgumentLoc> {};
553 :
public ValueConverter<LambdaCapture> {};
556struct DynTypedNode::BaseConverter<
557 TemplateName, void> :
public ValueConverter<TemplateName> {};
560struct DynTypedNode::BaseConverter<
562 void> :
public ValueConverter<NestedNameSpecifierLoc> {};
566 void> :
public ValueConverter<QualType> {};
569struct DynTypedNode::BaseConverter<
570 T,
std::enable_if_t<std::is_base_of<TypeLoc, T>::value>>
571 :
public DynCastValueConverter<T, TypeLoc> {};
575 :
public PtrConverter<CXXBaseSpecifier> {};
579 :
public ValueConverter<ObjCProtocolLoc> {};
583 :
public PtrConverter<ConceptReference> {};
587 :
public PtrConverter<OffsetOfNode> {};
593template <
typename T,
typename EnablerT>
struct DynTypedNode::BaseConverter {
Forward declaration of all AST node types.
#define KIND_TO_KIND_ID(Class)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines the clang::TypeLoc interface and its subclasses.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
static ASTNodeKind getFromNode(const LambdaCapture &L)
StringRef asStringRef() const
String representation of the kind.
bool isBaseOf(ASTNodeKind Other) const
Returns true if this is a base kind of (or same as) Other.
constexpr ASTNodeKind()
Empty identifier. It matches nothing.
ASTNodeKind getCladeKind() const
constexpr bool hasPointerIdentity() const
Check if the given ASTNodeKind identifies a type that offers pointer identity.
constexpr bool operator<(const ASTNodeKind &Other) const
Strict weak ordering for ASTNodeKind.
static ASTNodeKind getMostDerivedCommonAncestor(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived common ancestor between Kind1 and Kind2.
static ASTNodeKind getMostDerivedType(ASTNodeKind Kind1, ASTNodeKind Kind2)
Return the most derived type between Kind1 and Kind2.
static ASTNodeKind getFromNode(const Decl &D)
constexpr bool isSame(ASTNodeKind Other) const
Returns true if this and Other represent the same kind.
constexpr bool isNone() const
Returns true only for the default ASTNodeKind()
static constexpr ASTNodeKind getFromNodeKind()
Construct an identifier for T.
Attr - This represents one attribute.
Represents a base class of a C++ class.
Represents a C++ base or member initializer.
A reference to a concept and its template args, as it appears in the code.
Decl - This represents one declaration (or definition), e.g.
A dynamically typed AST node container.
bool operator<(const DynTypedNode &Other) const
ASTNodeKind getNodeKind() const
bool operator==(const DynTypedNode &Other) const
bool operator!=(const DynTypedNode &Other) const
const T * get() const
Retrieve the stored node as type T.
const T & getUnchecked() const
Retrieve the stored node as type T.
static DynTypedNode create(const T &Node)
Creates a DynTypedNode from Node.
const void * getMemoizationData() const
Returns a pointer that identifies the stored AST node.
void dump(llvm::raw_ostream &OS, const ASTContext &Context) const
Dumps the node to the given output stream.
SourceRange getSourceRange(bool IncludeQualifier=false) const
For nodes which represent textual entities in the source code, return their SourceRange.
void print(llvm::raw_ostream &OS, const PrintingPolicy &PP) const
Prints the node to the given output stream.
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
This is a basic class for representing single OpenMP clause.
Helper class for OffsetOfExpr.
A (possibly-)qualified type.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
Location wrapper for a TemplateArgument.
Represents a template argument.
Represents a C++ template name within the type system.
Base wrapper for a particular "section" of type source info.
The base class of the type hierarchy.
DynTypedNode DynTypedNode
Top level wrappers for InstallAPI frontend operations.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
TraversalKind
Defines how we descend a level in the AST when we pass through expressions.
@ TK_AsIs
Will traverse all child nodes.
@ TK_IgnoreUnlessSpelledInSource
Ignore AST nodes not written in the source.
@ Result
The result type of a method or function.
const FunctionProtoType * T
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
hash_code hash_value(const clang::dependencies::ModuleID &ID)
Hooks for using ASTNodeKind as a key in a DenseMap.
static unsigned getHashValue(const ASTNodeKind &Val)
static bool isEqual(const ASTNodeKind &LHS, const ASTNodeKind &RHS)
Hooks for using DynTypedNode as a key in a DenseMap.
static unsigned getHashValue(const DynTypedNode &Val)
static bool isEqual(const DynTypedNode &LHS, const DynTypedNode &RHS)
Describes how types, statements, expressions, and declarations should be printed.