1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <array> 11 12 // reference operator[] (size_type) 13 // const_reference operator[] (size_type); // constexpr in C++14 14 // reference at (size_type) 15 // const_reference at (size_type); // constexpr in C++14 16 17 #include <array> 18 #include <cassert> 19 20 #include "test_macros.h" 21 22 // std::array is explicitly allowed to be initialized with A a = { init-list };. 23 // Disable the missing braces warning for this reason. 24 #include "disable_missing_braces_warning.h" 25 26 #if TEST_STD_VER > 14 27 constexpr bool check_idx( size_t idx, double val ) 28 { 29 std::array<double, 3> arr = {1, 2, 3.5}; 30 return arr[idx] == val; 31 } 32 #endif 33 34 int main() 35 { 36 { 37 typedef double T; 38 typedef std::array<T, 3> C; 39 C c = {1, 2, 3.5}; 40 C::reference r1 = c[0]; 41 assert(r1 == 1); 42 r1 = 5.5; 43 assert(c.front() == 5.5); 44 45 C::reference r2 = c[2]; 46 assert(r2 == 3.5); 47 r2 = 7.5; 48 assert(c.back() == 7.5); 49 } 50 { 51 typedef double T; 52 typedef std::array<T, 3> C; 53 const C c = {1, 2, 3.5}; 54 C::const_reference r1 = c[0]; 55 assert(r1 == 1); 56 C::const_reference r2 = c[2]; 57 assert(r2 == 3.5); 58 } 59 60 #if TEST_STD_VER > 11 61 { 62 typedef double T; 63 typedef std::array<T, 3> C; 64 constexpr C c = {1, 2, 3.5}; 65 66 constexpr T t1 = c[0]; 67 static_assert (t1 == 1, ""); 68 69 constexpr T t2 = c[2]; 70 static_assert (t2 == 3.5, ""); 71 } 72 #endif 73 74 #if TEST_STD_VER > 14 75 { 76 static_assert (check_idx(0, 1), ""); 77 static_assert (check_idx(1, 2), ""); 78 static_assert (check_idx(2, 3.5), ""); 79 } 80 #endif 81 } 82