[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