[llvm] e561875 - [ArrayRef] Make iterator_range constructor const-agnostic (#205183)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 3 09:12:31 PDT 2026
Author: Ramkumar Ramachandra
Date: 2026-07-03T16:12:26Z
New Revision: e56187575b740a182288244a2304d4ae1592b3ff
URL: https://github.com/llvm/llvm-project/commit/e56187575b740a182288244a2304d4ae1592b3ff
DIFF: https://github.com/llvm/llvm-project/commit/e56187575b740a182288244a2304d4ae1592b3ff.diff
LOG: [ArrayRef] Make iterator_range constructor const-agnostic (#205183)
Make the enable_if guard const-agnostic to help some use-cases.
Added:
Modified:
llvm/include/llvm/ADT/ArrayRef.h
llvm/unittests/ADT/ArrayRefTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h
index 6f12564c00c1e..ed91543e45bf1 100644
--- a/llvm/include/llvm/ADT/ArrayRef.h
+++ b/llvm/include/llvm/ADT/ArrayRef.h
@@ -117,8 +117,8 @@ template <typename T> class LLVM_GSL_POINTER [[nodiscard]] ArrayRef {
/// Construct an ArrayRef<T> from iterator_range<U*>. This uses SFINAE
/// to ensure that this is only used for iterator ranges over plain pointer
/// iterators.
- template <typename U, typename = std::enable_if_t<
- std::is_convertible_v<U *const *, T *const *>>>
+ template <typename U, typename = std::enable_if_t<std::is_convertible_v<
+ U *const *, std::add_const_t<T> *const *>>>
ArrayRef(const iterator_range<U *> &Range)
: Data(Range.begin()), Length(llvm::size(Range)) {}
diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp
index 622616f8144f1..aff26af348786 100644
--- a/llvm/unittests/ADT/ArrayRefTest.cpp
+++ b/llvm/unittests/ADT/ArrayRefTest.cpp
@@ -348,15 +348,27 @@ static_assert(!std::is_constructible_v<MutableArrayRef<TestBase *>,
"cannot construct MutableArrayRef pointer of base type");
static_assert(
- !std::is_constructible_v<ArrayRef<int>, iterator_range<const int *>>,
- "cannot construct ArrayRef with non-const elements from const iterator "
- "range");
+ std::is_constructible_v<ArrayRef<int>, iterator_range<const int *>>,
+ "should be able to construct ArrayRef with non-const elements from const "
+ "iterator_range");
+static_assert(
+ std::is_constructible_v<ArrayRef<const int>, iterator_range<int *>>,
+ "should be able to construct ArrayRef with const elements from non-const "
+ "iterator_range");
+static_assert(
+ std::is_constructible_v<ArrayRef<const int>, iterator_range<const int *>>,
+ "should be able to construct ArrayRef with const elements from const "
+ "iterator_range");
static_assert(
std::is_constructible_v<ArrayRef<char *>, iterator_range<char **>>,
"should be able to construct ArrayRef from iterator_range over pointers");
static_assert(
- !std::is_constructible_v<ArrayRef<char *>, iterator_range<char *const *>>,
+ std::is_constructible_v<ArrayRef<char *>, iterator_range<char *const *>>,
"should be able to construct ArrayRef from iterator_range over pointers");
+static_assert(
+ !std::is_constructible_v<ArrayRef<int *>, iterator_range<const int **>>,
+ "cannot strip const off the pointee when constructing ArrayRef over "
+ "pointers");
TEST(ArrayRefTest, ArrayRefFromIteratorRange) {
int A1[] = {42, -5, 0, 1000000, -1000000, 0};
@@ -372,7 +384,7 @@ TEST(ArrayRefTest, ArrayRefFromIteratorRange) {
EXPECT_EQ(A1[i], A3[i]);
}
-TEST(ArrayRefTest, ArrayRefFromIteratorConstRange) {
+TEST(ArrayRefTest, ArrayConstRefIteratorConstRange) {
const int A1[] = {42, -5, 0, 1000000, -1000000, 0};
ArrayRef<const int> A2 = make_range(&A1[0], &A1[5]);
@@ -381,6 +393,15 @@ TEST(ArrayRefTest, ArrayRefFromIteratorConstRange) {
EXPECT_EQ(A1[i], A2[i]);
}
+TEST(ArrayRefTest, ArrayRefFromIteratorConstRange) {
+ const int A1[] = {42, -5, 0, 1000000, -1000000, 0};
+ ArrayRef<int> A2 = make_range(&A1[0], &A1[5]);
+
+ EXPECT_EQ(5ull, A2.size());
+ for (std::size_t i = 0; i < A2.size(); ++i)
+ EXPECT_EQ(A1[i], A2[i]);
+}
+
static_assert(std::is_trivially_copyable_v<ArrayRef<int>>,
"trivially copyable");
More information about the llvm-commits
mailing list