14 #ifndef LLVM_CLANG_AST_REDECLARABLE_H 15 #define LLVM_CLANG_AST_REDECLARABLE_H 18 #include "llvm/ADT/DenseMapInfo.h" 19 #include "llvm/ADT/PointerUnion.h" 20 #include "llvm/ADT/iterator_range.h" 21 #include "llvm/Support/Casting.h" 86 template<
typename decl_type>
99 using UninitializedLatest =
const void *;
106 using NotKnownLatest = llvm::PointerUnion<Previous, UninitializedLatest>;
108 mutable llvm::PointerUnion<NotKnownLatest, KnownLatest> Next;
115 : Next(NotKnownLatest(reinterpret_cast<UninitializedLatest>(&Ctx))) {}
119 return Next.is<NotKnownLatest>() &&
122 Next.get<NotKnownLatest>().template is<Previous>();
127 decl_type *
getNext(
const decl_type *D)
const {
128 if (Next.is<NotKnownLatest>()) {
129 NotKnownLatest NKL = Next.get<NotKnownLatest>();
131 return static_cast<decl_type*>(NKL.get<
Previous>());
134 Next =
KnownLatest(*reinterpret_cast<const ASTContext *>(
135 NKL.get<UninitializedLatest>()),
136 const_cast<decl_type *>(D));
139 return static_cast<decl_type*
>(Next.get<
KnownLatest>().
get(D));
143 assert(
NextIsPrevious() &&
"decl became non-canonical unexpectedly");
148 assert(
NextIsLatest() &&
"decl became canonical unexpectedly");
149 if (Next.is<NotKnownLatest>()) {
150 NotKnownLatest NKL = Next.get<NotKnownLatest>();
151 Next =
KnownLatest(*reinterpret_cast<const ASTContext *>(
152 NKL.get<UninitializedLatest>()),
165 if (Next.is<NotKnownLatest>())
195 return RedeclLink.getNext(static_cast<const decl_type *>(
this));
204 First(static_cast<decl_type *>(this)) {}
209 if (RedeclLink.NextIsPrevious())
214 return const_cast<decl_type *
>(
246 decl_type *Current =
nullptr;
248 bool PassedFirst =
false;
264 assert(Current &&
"Advancing while iterator has reached end");
266 if (Current->isFirstDecl()) {
268 assert(0 &&
"Passed first decl twice, invalid redecl chain!");
276 decl_type *Next = Current->getNextRedeclaration();
277 Current = (Next != Starter) ? Next :
nullptr;
288 return x.Current == y.Current;
291 return x.Current != y.Current;
300 return redecl_range(redecl_iterator(const_cast<decl_type *>(
301 static_cast<const decl_type *>(
this))),
316 template<
typename decl_type>
324 decl_type *D =
static_cast<decl_type*
>(
this);
325 if (!D->isFromASTFile())
333 const decl_type *D =
static_cast<const decl_type*
>(
this);
334 if (!D->isFromASTFile())
360 operator decl_type *() {
return Ptr; }
361 operator const decl_type *()
const {
return Ptr; }
372 decl_type *Ptr =
nullptr;
379 template <
typename decl_type>
388 P.Ptr = BaseInfo::getEmptyKey();
394 P.Ptr = BaseInfo::getTombstoneKey();
399 return BaseInfo::getHashValue(P);
404 return BaseInfo::isEqual(LHS, RHS);
410 #endif // LLVM_CLANG_AST_REDECLARABLE_H static const Decl * getCanonicalDecl(const Decl *D)
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
decl_type * getNext(const decl_type *D) const
Decl - This represents one declaration (or definition), e.g.
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
static unsigned getHashValue(const CanonicalDeclPtr &P)
void setPrevious(decl_type *D)
virtual void CompleteRedeclChain(const Decl *D)
Gives the external AST source an opportunity to complete the redeclaration chain for a declaration...
static DeclLink LatestDeclLink(const ASTContext &Ctx)
DeclLink(LatestTag, const ASTContext &Ctx)
Provides common interface for the Decls that can be redeclared.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
static bool isEqual(const CanonicalDeclPtr &LHS, const CanonicalDeclPtr &RHS)
friend bool operator==(redecl_iterator x, redecl_iterator y)
DeclLink(PreviousTag, decl_type *D)
const decl_type * getPreviousDecl() const
DeclLink RedeclLink
Points to the next redeclaration in the chain.
bool NextIsPrevious() const
static CanonicalDeclPtr getEmptyKey()
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
CanonicalDeclPtr(decl_type *Ptr)
static CanonicalDeclPtr getTombstoneKey()
std::ptrdiff_t difference_type
redecl_iterator operator++(int)
const decl_type & operator*() const
redecl_iterator redecls_begin() const
const decl_type * getMostRecentDecl() const
Returns the most recent (re)declaration of this declaration.
Iterates through all the redeclarations of the same decl.
static DeclLink PreviousDeclLink(decl_type *D)
Decl * getPrimaryMergedDecl(Decl *D)
Get the primary declaration for a declaration from an AST file.
pointer operator->() const
redecl_iterator & operator++()
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool NextIsLatest() const
Redeclarable(const ASTContext &Ctx)
const decl_type * operator->() const
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
const decl_type * getFirstDecl() const
Return the first declaration of this declaration or itself if this is the only declaration.
__PTRDIFF_TYPE__ ptrdiff_t
A signed integer type that is the result of subtracting two pointers.
Dataflow Directional Tag Classes.
redecl_iterator redecls_end() const
llvm::iterator_range< redecl_iterator > redecl_range
void set(T NewValue)
Set the value of this pointer, in the current generation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
friend bool operator!=(redecl_iterator x, redecl_iterator y)
void setLatest(decl_type *D)
Decl * getLatestNotUpdated() const
decl_type * getNextRedeclaration() const
redecl_iterator(decl_type *C)
const decl_type * getFirstDecl() const
Return the first declaration of this declaration or itself if this is the only declaration.
std::forward_iterator_tag iterator_category
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...
reference operator*() const
bool isFirstDecl() const
Returns true if this is the first declaration.
A wrapper class around a pointer that always points to its canonical declaration. ...