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

David Blaikie dblaikie at gmail.com
Tue Aug 19 11:04:03 PDT 2014


On Tue, Aug 19, 2014 at 9:36 AM, Duncan P. N. Exon Smith
<dexonsmith at apple.com> wrote:
> 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.

Adding a comment might be nice, describing what we're working around,
so we can switch it back later?

>
> 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.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list