[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