//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// <array>

// T *data();

#include <array>
#include <cassert>
#include <cstddef> // for std::max_align_t
#include <cstdint>

#include "test_macros.h"

struct NoDefault {
  TEST_CONSTEXPR NoDefault(int) {}
};

#if TEST_STD_VER < 11
struct natural_alignment {
  long t1;
  long long t2;
  double t3;
  long double t4;
};
#endif

TEST_CONSTEXPR_CXX17 bool tests() {
  {
    typedef double T;
    typedef std::array<T, 3> C;
    C c = {1, 2, 3.5};
    ASSERT_NOEXCEPT(c.data());
    T* p = c.data();
    assert(p[0] == 1);
    assert(p[1] == 2);
    assert(p[2] == 3.5);
  }
  {
    typedef double T;
    typedef std::array<T, 0> C;
    C c = {};
    ASSERT_NOEXCEPT(c.data());
    T* p = c.data();
    (void)p;
  }
  {
    typedef double T;
    typedef std::array<const T, 0> C;
    C c = {{}};
    ASSERT_NOEXCEPT(c.data());
    const T* p = c.data();
    (void)p;
    static_assert((std::is_same<decltype(c.data()), const T*>::value), "");
  }
  {
    typedef NoDefault T;
    typedef std::array<T, 0> C;
    C c = {};
    ASSERT_NOEXCEPT(c.data());
    T* p = c.data();
    (void)p;
  }
  {
    std::array<int, 5> c = {0, 1, 2, 3, 4};
    assert(c.data() == &c[0]);
    assert(*c.data() == c[0]);
  }

  return true;
}

int main(int, char**) {
  tests();
#if TEST_STD_VER >= 17
  static_assert(tests(), "");
#endif

  // Test the alignment of data()
  {
#if TEST_STD_VER < 11
    typedef natural_alignment T;
#else
    typedef std::max_align_t T;
#endif
    typedef std::array<T, 0> C;
    const C c           = {};
    const T* p          = c.data();
    std::uintptr_t pint = reinterpret_cast<std::uintptr_t>(p);
    assert(pint % TEST_ALIGNOF(T) == 0);
  }
  return 0;
}
