15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
35a83710eSEric Fiselier //                     The LLVM Compiler Infrastructure
45a83710eSEric Fiselier //
55a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open
65a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details.
75a83710eSEric Fiselier //
85a83710eSEric Fiselier //===----------------------------------------------------------------------===//
95a83710eSEric Fiselier 
105a83710eSEric Fiselier // <array>
115a83710eSEric Fiselier 
125a83710eSEric Fiselier // T *data();
135a83710eSEric Fiselier 
145a83710eSEric Fiselier #include <array>
155a83710eSEric Fiselier #include <cassert>
16*59cdf90aSEric Fiselier #include "test_macros.h"
175a83710eSEric Fiselier 
18b4e2e7a2SEric Fiselier // std::array is explicitly allowed to be initialized with A a = { init-list };.
19b4e2e7a2SEric Fiselier // Disable the missing braces warning for this reason.
20b4e2e7a2SEric Fiselier #include "disable_missing_braces_warning.h"
212decfad7SEric Fiselier 
225a83710eSEric Fiselier int main()
235a83710eSEric Fiselier {
245a83710eSEric Fiselier     {
255a83710eSEric Fiselier         typedef double T;
265a83710eSEric Fiselier         typedef std::array<T, 3> C;
275a83710eSEric Fiselier         C c = {1, 2, 3.5};
285a83710eSEric Fiselier         T* p = c.data();
295a83710eSEric Fiselier         assert(p[0] == 1);
305a83710eSEric Fiselier         assert(p[1] == 2);
315a83710eSEric Fiselier         assert(p[2] == 3.5);
325a83710eSEric Fiselier     }
335a83710eSEric Fiselier     {
345a83710eSEric Fiselier         typedef double T;
355a83710eSEric Fiselier         typedef std::array<T, 0> C;
365a83710eSEric Fiselier         C c = {};
375a83710eSEric Fiselier         T* p = c.data();
38*59cdf90aSEric Fiselier         assert(p != nullptr);
39*59cdf90aSEric Fiselier     }
40*59cdf90aSEric Fiselier     {
41*59cdf90aSEric Fiselier       typedef double T;
42*59cdf90aSEric Fiselier       typedef std::array<const T, 0> C;
43*59cdf90aSEric Fiselier       C c = {{}};
44*59cdf90aSEric Fiselier       const T* p = c.data();
45*59cdf90aSEric Fiselier       static_assert((std::is_same<decltype(c.data()), const T*>::value), "");
46*59cdf90aSEric Fiselier       assert(p != nullptr);
47*59cdf90aSEric Fiselier     }
48*59cdf90aSEric Fiselier   {
49*59cdf90aSEric Fiselier       typedef std::max_align_t T;
50*59cdf90aSEric Fiselier       typedef std::array<T, 0> C;
51*59cdf90aSEric Fiselier       const C c = {};
52*59cdf90aSEric Fiselier       const T* p = c.data();
53*59cdf90aSEric Fiselier       assert(p != nullptr);
54*59cdf90aSEric Fiselier       std::uintptr_t pint = reinterpret_cast<std::uintptr_t>(p);
55*59cdf90aSEric Fiselier       assert(pint % TEST_ALIGNOF(std::max_align_t) == 0);
56*59cdf90aSEric Fiselier     }
57*59cdf90aSEric Fiselier     {
58*59cdf90aSEric Fiselier       struct NoDefault {
59*59cdf90aSEric Fiselier         NoDefault(int) {}
60*59cdf90aSEric Fiselier       };
61*59cdf90aSEric Fiselier       typedef NoDefault T;
62*59cdf90aSEric Fiselier       typedef std::array<T, 0> C;
63*59cdf90aSEric Fiselier       C c = {};
64*59cdf90aSEric Fiselier       T* p = c.data();
65*59cdf90aSEric Fiselier       assert(p != nullptr);
665a83710eSEric Fiselier     }
675a83710eSEric Fiselier }
68