1*bbb1b6f9SApple OSS Distributions // 2*bbb1b6f9SApple OSS Distributions // Tests for 3*bbb1b6f9SApple OSS Distributions // __unsafe_forge_span functions 4*bbb1b6f9SApple OSS Distributions // 5*bbb1b6f9SApple OSS Distributions 6*bbb1b6f9SApple OSS Distributions #include <span> 7*bbb1b6f9SApple OSS Distributions #include <vector> 8*bbb1b6f9SApple OSS Distributions #include <os/cxx_safe_buffers.h> 9*bbb1b6f9SApple OSS Distributions #include <darwintest.h> 10*bbb1b6f9SApple OSS Distributions 11*bbb1b6f9SApple OSS Distributions #define CHECK(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__) 12*bbb1b6f9SApple OSS Distributions 13*bbb1b6f9SApple OSS Distributions struct S { 14*bbb1b6f9SApple OSS Distributions int i; 15*bbb1b6f9SApple OSS Distributions }; 16*bbb1b6f9SApple OSS Distributions 17*bbb1b6f9SApple OSS Distributions template <typename T> 18*bbb1b6f9SApple OSS Distributions static void tests()19*bbb1b6f9SApple OSS Distributionstests() 20*bbb1b6f9SApple OSS Distributions { 21*bbb1b6f9SApple OSS Distributions { 22*bbb1b6f9SApple OSS Distributions T * p = new T[10]; 23*bbb1b6f9SApple OSS Distributions std::span<T> span = os::span::__unsafe_forge_span(p, 10); 24*bbb1b6f9SApple OSS Distributions 25*bbb1b6f9SApple OSS Distributions CHECK(span.data() == p && span.size() == 10); 26*bbb1b6f9SApple OSS Distributions delete[] p; 27*bbb1b6f9SApple OSS Distributions } 28*bbb1b6f9SApple OSS Distributions { 29*bbb1b6f9SApple OSS Distributions const T * p = new T[10]; 30*bbb1b6f9SApple OSS Distributions std::span<const T> span = os::span::__unsafe_forge_span(p, 10); 31*bbb1b6f9SApple OSS Distributions 32*bbb1b6f9SApple OSS Distributions CHECK(span.data() == p && span.size() == 10); 33*bbb1b6f9SApple OSS Distributions delete[] p; 34*bbb1b6f9SApple OSS Distributions } 35*bbb1b6f9SApple OSS Distributions { 36*bbb1b6f9SApple OSS Distributions std::vector<T> v; 37*bbb1b6f9SApple OSS Distributions std::span<T> span = os::span::__unsafe_forge_span(v.begin(), v.end()); 38*bbb1b6f9SApple OSS Distributions 39*bbb1b6f9SApple OSS Distributions CHECK(span.data() == v.data() && span.size() == 0); 40*bbb1b6f9SApple OSS Distributions } 41*bbb1b6f9SApple OSS Distributions { 42*bbb1b6f9SApple OSS Distributions T * p = new T[10]; 43*bbb1b6f9SApple OSS Distributions std::span<T> span = os::unsafe_forge_span(p, 10); 44*bbb1b6f9SApple OSS Distributions std::span<T, 10> span2 = os::unsafe_forge_span<T, 10>(p); 45*bbb1b6f9SApple OSS Distributions 46*bbb1b6f9SApple OSS Distributions CHECK(span.data() == p && span.size() == 10); 47*bbb1b6f9SApple OSS Distributions CHECK(span2.data() == p && span2.size() == 10); 48*bbb1b6f9SApple OSS Distributions delete[] p; 49*bbb1b6f9SApple OSS Distributions } 50*bbb1b6f9SApple OSS Distributions { 51*bbb1b6f9SApple OSS Distributions std::vector<T> v; 52*bbb1b6f9SApple OSS Distributions std::span<T> span = os::unsafe_forge_span(v.begin(), v.end()); 53*bbb1b6f9SApple OSS Distributions 54*bbb1b6f9SApple OSS Distributions CHECK(span.data() == v.data() && span.size() == 0); 55*bbb1b6f9SApple OSS Distributions } 56*bbb1b6f9SApple OSS Distributions } 57*bbb1b6f9SApple OSS Distributions 58*bbb1b6f9SApple OSS Distributions T_DECL(unsafe_forge_span, "cxx_safe_buffers.unsafe_forge_span") 59*bbb1b6f9SApple OSS Distributions { 60*bbb1b6f9SApple OSS Distributions tests<S>(); 61*bbb1b6f9SApple OSS Distributions } 62