1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // UNSUPPORTED: c++03, c++11, c++14, c++17 9 10 // This test also generates spurious warnings when instantiating std::span 11 // with a very large extent (like size_t(-2)) -- silence those. 12 // ADDITIONAL_COMPILE_FLAGS: -Xclang -verify-ignore-unexpected=warning 13 14 // <span> 15 16 // template<size_t Offset, size_t Count = dynamic_extent> 17 // constexpr span<element_type, see below> subspan() const; 18 // 19 // Requires: offset <= size() && 20 // (count == dynamic_extent || count <= size() - offset) 21 22 #include <span> 23 #include <cstddef> 24 25 void f() { 26 int array[] = {1, 2, 3, 4}; 27 std::span<const int, 4> sp(array); 28 29 // Offset too large templatized 30 [[maybe_unused]] auto s1 = sp.subspan<5>(); // expected-error@span:* {{span<T, N>::subspan<Offset, Count>(): Offset out of range}} 31 32 // Count too large templatized 33 [[maybe_unused]] auto s2 = sp.subspan<0, 5>(); // expected-error@span:* {{span<T, N>::subspan<Offset, Count>(): Offset + Count out of range}} 34 35 // Offset + Count too large templatized 36 [[maybe_unused]] auto s3 = sp.subspan<2, 3>(); // expected-error@span:* {{span<T, N>::subspan<Offset, Count>(): Offset + Count out of range}} 37 38 // Offset + Count overflow templatized 39 [[maybe_unused]] auto s4 = sp.subspan<3, std::size_t(-2)>(); // expected-error@span:* {{span<T, N>::subspan<Offset, Count>(): Offset + Count out of range}}, expected-error-re@span:* {{array is too large{{(.* elements)}}}} 40 } 41