Skip to content

Commit 503b602

Browse files
committed
!fixup simplify SFINAE check
1 parent da7f275 commit 503b602

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

llvm/include/llvm/ADT/ArrayRef.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,9 @@ namespace llvm {
150150
: Data(Vec.data()), Length(Vec.size()) {}
151151

152152
/// Construct an ArrayRef<T> from iterator_range<U*>. This uses SFINAE
153-
/// to ensure that this is only used for iterator ranges of random access
154-
/// iterators that can be converted.
155-
template <typename U,
156-
typename = std::enable_if<
157-
std::is_base_of<
158-
std::random_access_iterator_tag,
159-
typename std::iterator_traits<
160-
decltype(std::declval<const iterator_range<U *> &>()
161-
.begin())>::iterator_category>::value &&
162-
std::is_convertible_v<U *, T const *>>>
153+
/// to ensure that this is only used for iterator ranges over plain pointer
154+
/// iterators.
155+
template <typename U, typename = std::enable_if_t<std::is_same_v<U *, T *>>>
163156
ArrayRef(const iterator_range<U *> &Range)
164157
: Data(Range.begin()), Length(llvm::size(Range)) {}
165158

llvm/unittests/ADT/ArrayRefTest.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,20 @@ TEST(ArrayRefTest, ArrayRefFromStdArray) {
255255
}
256256
}
257257

258+
struct TestRandomAccessIterator {
259+
using iterator_category = std::random_access_iterator_tag;
260+
};
261+
262+
static_assert(
263+
!std::is_constructible<ArrayRef<int>,
264+
iterator_range<TestRandomAccessIterator>>::value,
265+
"cannot construct from iterator range with non-pointer iterator");
266+
static_assert(!std::is_constructible<ArrayRef<int>, iterator_range<int>>::value,
267+
"cannot construct from iterator range with non-pointer iterator");
268+
static_assert(
269+
std::is_constructible<ArrayRef<char *>, iterator_range<char **>>::value,
270+
"should be able to construct ArrayRef from iterator_range over pointers");
271+
258272
TEST(ArrayRefTest, ArrayRefFromIteratorRange) {
259273
std::array<int, 5> A1{{42, -5, 0, 1000000, -1000000}};
260274
ArrayRef<int> A2 = make_range(A1.begin(), A1.end());

0 commit comments

Comments
 (0)