Home | History | Annotate | Download | only in array
      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 front();       // constexpr in C++17
     13 // reference back();        // constexpr in C++17
     14 // const_reference front(); // constexpr in C++14
     15 // const_reference back();  // 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_front( double val )
     28 {
     29     std::array<double, 3> arr = {1, 2, 3.5};
     30 	return arr.front() == val;
     31 }
     32 
     33 constexpr bool check_back( double val )
     34 {
     35     std::array<double, 3> arr = {1, 2, 3.5};
     36 	return arr.back() == val;
     37 }
     38 #endif
     39 
     40 int main()
     41 {
     42     {
     43         typedef double T;
     44         typedef std::array<T, 3> C;
     45         C c = {1, 2, 3.5};
     46 
     47         C::reference r1 = c.front();
     48         assert(r1 == 1);
     49         r1 = 5.5;
     50         assert(c[0] == 5.5);
     51 
     52         C::reference r2 = c.back();
     53         assert(r2 == 3.5);
     54         r2 = 7.5;
     55         assert(c[2] == 7.5);
     56     }
     57     {
     58         typedef double T;
     59         typedef std::array<T, 3> C;
     60         const C c = {1, 2, 3.5};
     61         C::const_reference r1 = c.front();
     62         assert(r1 == 1);
     63 
     64         C::const_reference r2 = c.back();
     65         assert(r2 == 3.5);
     66     }
     67 
     68 #if TEST_STD_VER > 11
     69     {
     70         typedef double T;
     71         typedef std::array<T, 3> C;
     72         constexpr C c = {1, 2, 3.5};
     73 
     74         constexpr T t1 = c.front();
     75         static_assert (t1 == 1, "");
     76 
     77         constexpr T t2 = c.back();
     78         static_assert (t2 == 3.5, "");
     79     }
     80 #endif
     81 
     82 #if TEST_STD_VER > 14
     83     {
     84         static_assert (check_front(1),   "");
     85         static_assert (check_back (3.5), "");
     86     }
     87 #endif
     88 }
     89