Skip to content

Commit

Permalink
Fix LLVM_REVERSE_ITERATION
Browse files Browse the repository at this point in the history
A recent change (4e86e5e), broke `LLVM_REVERSE_ITERATION` for DenseMaps by adding an assert. It is valid to de-reference and increment one step behind `End` when reverse iteration is enabled because `End` is actually the start of the pointer bucket.
  • Loading branch information
llvm-beanz committed Apr 20, 2020
1 parent 365b60f commit 31282d3
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions llvm/include/llvm/ADT/DenseMap.h
Expand Up @@ -1200,16 +1200,20 @@ class DenseMapIterator : DebugEpochBase::HandleBase {

reference operator*() const {
assert(isHandleInSync() && "invalid iterator access!");
assert(Ptr != End && "dereferencing end() iterator");
if (shouldReverseIterate<KeyT>())
if (shouldReverseIterate<KeyT>()) {
assert(Ptr != End[-1] && "dereferencing end() iterator");
return Ptr[-1];
}
assert(Ptr != End && "dereferencing end() iterator");
return *Ptr;
}
pointer operator->() const {
assert(isHandleInSync() && "invalid iterator access!");
assert(Ptr != End && "dereferencing end() iterator");
if (shouldReverseIterate<KeyT>())
if (shouldReverseIterate<KeyT>()) {
assert(Ptr != End[-1] && "dereferencing end() iterator");
return &(Ptr[-1]);
}
assert(Ptr != End && "dereferencing end() iterator");
return Ptr;
}

Expand All @@ -1230,12 +1234,13 @@ class DenseMapIterator : DebugEpochBase::HandleBase {

inline DenseMapIterator& operator++() { // Preincrement
assert(isHandleInSync() && "invalid iterator access!");
assert(Ptr != End && "incrementing end() iterator");
if (shouldReverseIterate<KeyT>()) {
assert(Ptr != End[-1] && "dereferencing end() iterator");
--Ptr;
RetreatPastEmptyBuckets();
return *this;
}
assert(Ptr != End && "incrementing end() iterator");
++Ptr;
AdvancePastEmptyBuckets();
return *this;
Expand Down

0 comments on commit 31282d3

Please sign in to comment.