From: Nuno Lopes Date: Tue, 8 Dec 2020 18:36:24 +0000 (+0000) Subject: DenseMap: fix build with clang in C++20 mode X-Git-Tag: llvmorg-13-init~4017 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3c01af9aeebe01030e6138cece02675d2f148bb3;p=platform%2Fupstream%2Fllvm.git DenseMap: fix build with clang in C++20 mode clang was complaing about this code: llvm/include/llvm/IR/PassManager.h:715:17: error: ISO C++20 considers use of overloaded operator '!=' to be ambiguous despite there being a unique best viable function with non-reversed arguments [-Werror,-Wambiguous-reversed-operator] if (IMapI != IsResultInvalidated.end()) ~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~ llvm/include/llvm/ADT/DenseMap.h:1253:8: note: candidate function with non-reversed arguments bool operator!=(const ConstIterator &RHS) const { ^ llvm/include/llvm/ADT/DenseMap.h:1246:8: note: ambiguous candidate function with reversed arguments bool operator==(const ConstIterator &RHS) const { ^ The warning is triggered when the DenseMapIterator (lhs) is not const and so the == operator is applied to different types on lhs/rhs. Using a template allows the function to be available for both const/non-const iterator types and gets rid of the warning --- diff --git a/llvm/include/llvm/ADT/DenseMap.h b/llvm/include/llvm/ADT/DenseMap.h index f591ee0..7da3471 100644 --- a/llvm/include/llvm/ADT/DenseMap.h +++ b/llvm/include/llvm/ADT/DenseMap.h @@ -1189,8 +1189,6 @@ class DenseMapIterator : DebugEpochBase::HandleBase { friend class DenseMapIterator; friend class DenseMapIterator; - using ConstIterator = DenseMapIterator; - public: using difference_type = ptrdiff_t; using value_type = @@ -1243,14 +1241,17 @@ public: return Ptr; } - bool operator==(const ConstIterator &RHS) const { + template + bool operator==(const T &RHS) const { assert((!Ptr || isHandleInSync()) && "handle not in sync!"); assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!"); assert(getEpochAddress() == RHS.getEpochAddress() && "comparing incomparable iterators!"); return Ptr == RHS.Ptr; } - bool operator!=(const ConstIterator &RHS) const { + + template + bool operator!=(const T &RHS) const { assert((!Ptr || isHandleInSync()) && "handle not in sync!"); assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!"); assert(getEpochAddress() == RHS.getEpochAddress() &&