Index: llvm/include/llvm/Support/AlignOf.h =================================================================== --- llvm/include/llvm/Support/AlignOf.h +++ llvm/include/llvm/Support/AlignOf.h @@ -30,44 +30,36 @@ }; namespace detail { -template -class AlignerImpl { - T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7; T8 t8; T9 t9; T10 t10; - AlignerImpl() = delete; -}; +/// Compute the maximum alignment over the types in the variadic pack. +template constexpr size_t max_alignof() { return alignof(T0); } +template +constexpr size_t max_alignof() { + return (max_alignof() > max_alignof()) + ? max_alignof() + : max_alignof(); +} + +/// Compute the maximum size over the types in the variadic pack. +template constexpr size_t max_sizeof() { return sizeof(T0); } +template +constexpr size_t max_sizeof() { + return (max_sizeof() > max_sizeof()) ? max_sizeof() + : max_sizeof(); +} -template -union SizerImpl { - char arr1[sizeof(T1)], arr2[sizeof(T2)], arr3[sizeof(T3)], arr4[sizeof(T4)], - arr5[sizeof(T5)], arr6[sizeof(T6)], arr7[sizeof(T7)], arr8[sizeof(T8)], - arr9[sizeof(T9)], arr10[sizeof(T10)]; -}; } // end namespace detail /// \brief This union template exposes a suitably aligned and sized character -/// array member which can hold elements of any of up to ten types. +/// array member which can hold any of the requested types. /// /// These types may be arrays, structs, or any other types. The goal is to /// expose a char array buffer member which can be used as suitable storage for -/// a placement new of any of these types. Support for more than ten types can -/// be added at the cost of more boilerplate. -template -struct AlignedCharArrayUnion : llvm::AlignedCharArray< - alignof(llvm::detail::AlignerImpl), - sizeof(::llvm::detail::SizerImpl)> { -}; +/// a placement new of any of these types. +template +struct AlignedCharArrayUnion + : llvm::AlignedCharArray(), + detail::max_sizeof()> {}; } // end namespace llvm #endif // LLVM_SUPPORT_ALIGNOF_H