[llvm] r215986 - ADT: Avoid using std::equal in ArrayRef::equals

Duncan P. N. Exon Smith dexonsmith at apple.com
Tue Aug 19 09:36:22 PDT 2014


Author: dexonsmith
Date: Tue Aug 19 11:36:21 2014
New Revision: 215986

URL: http://llvm.org/viewvc/llvm-project?rev=215986&view=rev
Log:
ADT: Avoid using std::equal in ArrayRef::equals

MSVC's STL has a bug in `std::equal()`: it asserts on nullptr iterators,
causing a block revert in r215981.  This works around that by re-writing
`ArrayRef::equals()` to do the work itself.

Modified:
    llvm/trunk/include/llvm/ADT/ArrayRef.h

Modified: llvm/trunk/include/llvm/ADT/ArrayRef.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ArrayRef.h?rev=215986&r1=215985&r2=215986&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/ArrayRef.h (original)
+++ llvm/trunk/include/llvm/ADT/ArrayRef.h Tue Aug 19 11:36:21 2014
@@ -145,7 +145,13 @@ namespace llvm {
     bool equals(ArrayRef RHS) const {
       if (Length != RHS.Length)
         return false;
-      return std::equal(begin(), end(), RHS.begin());
+      // Don't use std::equal(), since it asserts in MSVC on nullptr iterators.
+      for (auto L = begin(), LE = end(), R = RHS.begin(); L != LE; ++L, ++R)
+        // Match std::equal() in using == (instead of !=) to minimize API
+        // requirements of ArrayRef'ed types.
+        if (!(*L == *R))
+          return false;
+      return true;
     }
 
     /// slice(n) - Chop off the first N elements of the array.





More information about the llvm-commits mailing list