diff options
Diffstat (limited to 'include/clang/AST/Redeclarable.h')
-rw-r--r-- | include/clang/AST/Redeclarable.h | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/include/clang/AST/Redeclarable.h b/include/clang/AST/Redeclarable.h index e87ca78..88abadb 100644 --- a/include/clang/AST/Redeclarable.h +++ b/include/clang/AST/Redeclarable.h @@ -64,22 +64,22 @@ public: /// \brief Return the previous declaration of this declaration or NULL if this /// is the first declaration. - decl_type *getPreviousDeclaration() { + decl_type *getPreviousDecl() { if (RedeclLink.NextIsPrevious()) return RedeclLink.getNext(); return 0; } - const decl_type *getPreviousDeclaration() const { + const decl_type *getPreviousDecl() const { return const_cast<decl_type *>( - static_cast<const decl_type*>(this))->getPreviousDeclaration(); + static_cast<const decl_type*>(this))->getPreviousDecl(); } /// \brief Return the first declaration of this declaration or itself if this /// is the only declaration. decl_type *getFirstDeclaration() { decl_type *D = static_cast<decl_type*>(this); - while (D->getPreviousDeclaration()) - D = D->getPreviousDeclaration(); + while (D->getPreviousDecl()) + D = D->getPreviousDecl(); return D; } @@ -87,8 +87,8 @@ public: /// is the only declaration. const decl_type *getFirstDeclaration() const { const decl_type *D = static_cast<const decl_type*>(this); - while (D->getPreviousDeclaration()) - D = D->getPreviousDeclaration(); + while (D->getPreviousDecl()) + D = D->getPreviousDecl(); return D; } @@ -98,12 +98,12 @@ public: } /// \brief Returns the most recent (re)declaration of this declaration. - decl_type *getMostRecentDeclaration() { + decl_type *getMostRecentDecl() { return getFirstDeclaration()->RedeclLink.getNext(); } /// \brief Returns the most recent (re)declaration of this declaration. - const decl_type *getMostRecentDeclaration() const { + const decl_type *getMostRecentDecl() const { return getFirstDeclaration()->RedeclLink.getNext(); } @@ -116,6 +116,7 @@ public: /// Current - The current declaration. decl_type *Current; decl_type *Starter; + bool PassedFirst; public: typedef decl_type* value_type; @@ -125,13 +126,24 @@ public: typedef std::ptrdiff_t difference_type; redecl_iterator() : Current(0) { } - explicit redecl_iterator(decl_type *C) : Current(C), Starter(C) { } + explicit redecl_iterator(decl_type *C) + : Current(C), Starter(C), PassedFirst(false) { } reference operator*() const { return Current; } pointer operator->() const { return Current; } redecl_iterator& operator++() { assert(Current && "Advancing while iterator has reached end"); + // Sanity check to avoid infinite loop on invalid redecl chain. + if (Current->isFirstDeclaration()) { + if (PassedFirst) { + assert(0 && "Passed first decl twice, invalid redecl chain!"); + Current = 0; + return *this; + } + PassedFirst = true; + } + // Get either previous decl or latest decl. decl_type *Next = Current->RedeclLink.getNext(); Current = (Next != Starter ? Next : 0); |