diff --git a/libc/src/__support/CPP/CMakeLists.txt b/libc/src/__support/CPP/CMakeLists.txt index 08661aba5b6b1..e6f58b7cd8224 100644 --- a/libc/src/__support/CPP/CMakeLists.txt +++ b/libc/src/__support/CPP/CMakeLists.txt @@ -111,6 +111,7 @@ add_header_library( type_traits/add_lvalue_reference.h type_traits/add_pointer.h type_traits/add_rvalue_reference.h + type_traits/aligned_storage.h type_traits/always_false.h type_traits/bool_constant.h type_traits/conditional.h diff --git a/libc/src/__support/CPP/type_traits.h b/libc/src/__support/CPP/type_traits.h index 1494aeb905e09..d50b6612656db 100644 --- a/libc/src/__support/CPP/type_traits.h +++ b/libc/src/__support/CPP/type_traits.h @@ -12,6 +12,7 @@ #include "src/__support/CPP/type_traits/add_lvalue_reference.h" #include "src/__support/CPP/type_traits/add_pointer.h" #include "src/__support/CPP/type_traits/add_rvalue_reference.h" +#include "src/__support/CPP/type_traits/aligned_storage.h" #include "src/__support/CPP/type_traits/bool_constant.h" #include "src/__support/CPP/type_traits/conditional.h" #include "src/__support/CPP/type_traits/decay.h" diff --git a/libc/src/__support/CPP/type_traits/aligned_storage.h b/libc/src/__support/CPP/type_traits/aligned_storage.h new file mode 100644 index 0000000000000..574b1146f6b2a --- /dev/null +++ b/libc/src/__support/CPP/type_traits/aligned_storage.h @@ -0,0 +1,27 @@ +//===-- aligned_storage type_traits --------------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALIGNED_STORAGE_H +#define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALIGNED_STORAGE_H + +#include // size_t + +namespace LIBC_NAMESPACE::cpp { + +template struct aligned_storage { + struct type { + alignas(Align) unsigned char data[Len]; + }; +}; + +template +using aligned_storage_t = typename aligned_storage::type; + +} // namespace LIBC_NAMESPACE::cpp + +#endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_ALIGNED_STORAGE_H diff --git a/libc/test/src/__support/CPP/type_traits_test.cpp b/libc/test/src/__support/CPP/type_traits_test.cpp index a2051f3802753..1c428e93a2fd8 100644 --- a/libc/test/src/__support/CPP/type_traits_test.cpp +++ b/libc/test/src/__support/CPP/type_traits_test.cpp @@ -112,6 +112,15 @@ TEST(LlvmLibcTypeTraitsTest, add_rvalue_reference_void) { const volatile void>)); } +TEST(LlvmLibcTypeTraitsTest, aligned_storage) { + struct S { + int a, b; + }; + aligned_storage_t buf; + EXPECT_EQ(alignof(buf), alignof(S)); + EXPECT_EQ(sizeof(buf), sizeof(S)); +} + TEST(LlvmLibcTypeTraitsTest, bool_constant) { EXPECT_TRUE((bool_constant::value)); EXPECT_FALSE((bool_constant::value));