Index: include/llvm/Support/AlignOf.h =================================================================== --- include/llvm/Support/AlignOf.h +++ include/llvm/Support/AlignOf.h @@ -216,24 +216,28 @@ #endif // _MSC_VER 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; +template struct AlignerImpl { + enum { + X = AlignOf::Alignment, + Y = AlignerImpl::Alignment, + Alignment = (X > Y) ? X : Y + }; }; -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)]; +template struct AlignerImpl { + enum { Alignment = AlignOf::Alignment }; +}; + +template struct SizerImpl { + enum { + X = sizeof(T), + Y = SizerImpl::SizeOf, + SizeOf = (X > Y) ? X : Y + }; +}; + +template struct SizerImpl { + enum { SizeOf = sizeof(T) }; }; } // end namespace detail @@ -242,18 +246,11 @@ /// /// 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 >::Alignment, - sizeof(::llvm::detail::SizerImpl)> { -}; +/// a placement new of any of these types. +template +using AlignedCharArrayUnion = + llvm::AlignedCharArray::Alignment, + llvm::detail::SizerImpl::SizeOf>; } // end namespace llvm #endif // LLVM_SUPPORT_ALIGNOF_H