@@ -255,6 +255,64 @@ TEST(ArrayRefTest, ArrayRefFromStdArray) {
255255 }
256256}
257257
258+ struct TestRandomAccessIterator {
259+ using iterator_category = std::random_access_iterator_tag;
260+ };
261+
262+ static_assert (!std::is_constructible_v<
263+ ArrayRef<int >, iterator_range<TestRandomAccessIterator>>,
264+ " cannot construct from iterator range with non-pointer iterator" );
265+ static_assert (!std::is_constructible_v<ArrayRef<int >, iterator_range<int >>,
266+ " cannot construct from iterator range with non-pointer iterator" );
267+
268+ class TestBase {};
269+
270+ class TestDerived : public TestBase {};
271+
272+ static_assert (
273+ !std::is_constructible_v<ArrayRef<TestDerived>, iterator_range<TestBase *>>,
274+ " cannot construct ArrayRef with derived type" );
275+ static_assert (
276+ !std::is_constructible_v<ArrayRef<TestBase>, iterator_range<TestDerived *>>,
277+ " cannot construct ArrayRef base type" );
278+ static_assert (!std::is_constructible_v<ArrayRef<TestBase *>,
279+ iterator_range<TestDerived **>>,
280+ " cannot construct ArrayRef pointer of base type" );
281+
282+ static_assert (
283+ !std::is_constructible_v<ArrayRef<int >, iterator_range<const int *>>,
284+ " cannot construct ArrayRef with non-const elements from const iterator "
285+ " range" );
286+ static_assert (
287+ std::is_constructible_v<ArrayRef<char *>, iterator_range<char **>>,
288+ " should be able to construct ArrayRef from iterator_range over pointers" );
289+ static_assert (
290+ !std::is_constructible_v<ArrayRef<char *>, iterator_range<char *const *>>,
291+ " should be able to construct ArrayRef from iterator_range over pointers" );
292+
293+ TEST (ArrayRefTest, ArrayRefFromIteratorRange) {
294+ std::array<int , 5 > A1{{42 , -5 , 0 , 1000000 , -1000000 }};
295+ ArrayRef<int > A2 = make_range (A1.begin (), A1.end ());
296+
297+ EXPECT_EQ (A1.size (), A2.size ());
298+ for (std::size_t i = 0 ; i < A1.size (); ++i)
299+ EXPECT_EQ (A1[i], A2[i]);
300+
301+ ArrayRef<const int > A3 = make_range (A1.begin (), A1.end ());
302+ EXPECT_EQ (A1.size (), A3.size ());
303+ for (std::size_t i = 0 ; i < A1.size (); ++i)
304+ EXPECT_EQ (A1[i], A3[i]);
305+ }
306+
307+ TEST (ArrayRefTest, ArrayRefFromIteratorConstRange) {
308+ std::array<const int , 5 > A1{{42 , -5 , 0 , 1000000 , -1000000 }};
309+ ArrayRef<const int > A2 = make_range (A1.begin (), A1.end ());
310+
311+ EXPECT_EQ (A1.size (), A2.size ());
312+ for (std::size_t i = 0 ; i < A1.size (); ++i)
313+ EXPECT_EQ (A1[i], A2[i]);
314+ }
315+
258316static_assert (std::is_trivially_copyable_v<ArrayRef<int >>,
259317 " trivially copyable" );
260318
0 commit comments