summaryrefslogtreecommitdiff
path: root/libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp')
-rw-r--r--libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp b/libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp
new file mode 100644
index 000000000000..8b0f5a391eb3
--- /dev/null
+++ b/libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp
@@ -0,0 +1,51 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// Make sure std::array<T, N> is trivially copyable whenever T is trivially copyable.
+// This is not technically mandated by the Standard, but libc++ has been providing
+// this property.
+
+#include <array>
+#include <type_traits>
+
+struct Empty {};
+
+struct TrivialCopy {
+ int i;
+ double j;
+};
+
+struct NonTrivialCopy {
+ NonTrivialCopy(NonTrivialCopy const&) {}
+ NonTrivialCopy& operator=(NonTrivialCopy const&) { return *this; }
+};
+
+template <typename T>
+void check_trivially_copyable() {
+ static_assert(std::is_trivially_copyable<std::array<T, 0> >::value, "");
+ static_assert(std::is_trivially_copyable<std::array<T, 1> >::value, "");
+ static_assert(std::is_trivially_copyable<std::array<T, 2> >::value, "");
+ static_assert(std::is_trivially_copyable<std::array<T, 3> >::value, "");
+}
+
+int main(int, char**) {
+ check_trivially_copyable<int>();
+ check_trivially_copyable<long>();
+ check_trivially_copyable<double>();
+ check_trivially_copyable<long double>();
+ check_trivially_copyable<Empty>();
+ check_trivially_copyable<TrivialCopy>();
+
+ // Check that std::array<T, 0> is still trivially copyable when T is not
+ static_assert(std::is_trivially_copyable<std::array<NonTrivialCopy, 0> >::value, "");
+ static_assert(!std::is_trivially_copyable<std::array<NonTrivialCopy, 1> >::value, "");
+ static_assert(!std::is_trivially_copyable<std::array<NonTrivialCopy, 2> >::value, "");
+ static_assert(!std::is_trivially_copyable<std::array<NonTrivialCopy, 3> >::value, "");
+
+ return 0;
+}