<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Do we have MSVC support?<br class=""><div><blockquote type="cite" class=""><div class="">On Dec 1, 2016, at 12:52 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Any chance we can just replace this all with <a href="http://en.cppreference.com/w/cpp/types/aligned_union" class="">http://en.cppreference.com/w/cpp/types/aligned_union</a> ?<br class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Thu, Dec 1, 2016 at 11:56 AM Mehdi AMINI via Phabricator <<a href="mailto:reviews@reviews.llvm.org" class="">reviews@reviews.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">mehdi_amini created this revision.<br class="gmail_msg">
mehdi_amini added reviewers: zturner, dblaikie.<br class="gmail_msg">
mehdi_amini added a subscriber: llvm-commits.<br class="gmail_msg">
<br class="gmail_msg">
This is NFC but for lifting the limitation to 10 types.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D27314" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D27314</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  llvm/include/llvm/Support/AlignOf.h<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Index: llvm/include/llvm/Support/AlignOf.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- llvm/include/llvm/Support/AlignOf.h<br class="gmail_msg">
+++ llvm/include/llvm/Support/AlignOf.h<br class="gmail_msg">
@@ -30,44 +30,36 @@<br class="gmail_msg">
 };<br class="gmail_msg">
<br class="gmail_msg">
 namespace detail {<br class="gmail_msg">
-template <typename T1,<br class="gmail_msg">
-          typename T2 = char, typename T3 = char, typename T4 = char,<br class="gmail_msg">
-          typename T5 = char, typename T6 = char, typename T7 = char,<br class="gmail_msg">
-          typename T8 = char, typename T9 = char, typename T10 = char><br class="gmail_msg">
-class AlignerImpl {<br class="gmail_msg">
-  T1 t1; T2 t2; T3 t3; T4 t4; T5 t5; T6 t6; T7 t7; T8 t8; T9 t9; T10 t10;<br class="gmail_msg">
<br class="gmail_msg">
-  AlignerImpl() = delete;<br class="gmail_msg">
-};<br class="gmail_msg">
+/// Compute the maximum alignment over the types in the variadic pack.<br class="gmail_msg">
+template <typename T0> constexpr size_t max_alignof() { return alignof(T0); }<br class="gmail_msg">
+template <typename T0, typename T1, typename... Ts><br class="gmail_msg">
+constexpr size_t max_alignof() {<br class="gmail_msg">
+  return (max_alignof<T0>() > max_alignof<T1, Ts...>())<br class="gmail_msg">
+             ? max_alignof<T0>()<br class="gmail_msg">
+             : max_alignof<T1, Ts...>();<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+/// Compute the maximum size over the types in the variadic pack.<br class="gmail_msg">
+template <typename T0> constexpr size_t max_sizeof() { return sizeof(T0); }<br class="gmail_msg">
+template <typename T0, typename T1, typename... Ts><br class="gmail_msg">
+constexpr size_t max_sizeof() {<br class="gmail_msg">
+  return (max_sizeof<T0>() > max_sizeof<T1, Ts...>()) ? max_sizeof<T0>()<br class="gmail_msg">
+                                                      : max_sizeof<T1, Ts...>();<br class="gmail_msg">
+}<br class="gmail_msg">
<br class="gmail_msg">
-template <typename T1,<br class="gmail_msg">
-          typename T2 = char, typename T3 = char, typename T4 = char,<br class="gmail_msg">
-          typename T5 = char, typename T6 = char, typename T7 = char,<br class="gmail_msg">
-          typename T8 = char, typename T9 = char, typename T10 = char><br class="gmail_msg">
-union SizerImpl {<br class="gmail_msg">
-  char arr1[sizeof(T1)], arr2[sizeof(T2)], arr3[sizeof(T3)], arr4[sizeof(T4)],<br class="gmail_msg">
-       arr5[sizeof(T5)], arr6[sizeof(T6)], arr7[sizeof(T7)], arr8[sizeof(T8)],<br class="gmail_msg">
-       arr9[sizeof(T9)], arr10[sizeof(T10)];<br class="gmail_msg">
-};<br class="gmail_msg">
 } // end namespace detail<br class="gmail_msg">
<br class="gmail_msg">
 /// \brief This union template exposes a suitably aligned and sized character<br class="gmail_msg">
-/// array member which can hold elements of any of up to ten types.<br class="gmail_msg">
+/// array member which can hold any of the requested types.<br class="gmail_msg">
 ///<br class="gmail_msg">
 /// These types may be arrays, structs, or any other types. The goal is to<br class="gmail_msg">
 /// expose a char array buffer member which can be used as suitable storage for<br class="gmail_msg">
-/// a placement new of any of these types. Support for more than ten types can<br class="gmail_msg">
-/// be added at the cost of more boilerplate.<br class="gmail_msg">
-template <typename T1,<br class="gmail_msg">
-          typename T2 = char, typename T3 = char, typename T4 = char,<br class="gmail_msg">
-          typename T5 = char, typename T6 = char, typename T7 = char,<br class="gmail_msg">
-          typename T8 = char, typename T9 = char, typename T10 = char><br class="gmail_msg">
-struct AlignedCharArrayUnion : llvm::AlignedCharArray<<br class="gmail_msg">
-    alignof(llvm::detail::AlignerImpl<T1, T2, T3, T4, T5,<br class="gmail_msg">
-                                      T6, T7, T8, T9, T10>),<br class="gmail_msg">
-    sizeof(::llvm::detail::SizerImpl<T1, T2, T3, T4, T5,<br class="gmail_msg">
-                                     T6, T7, T8, T9, T10>)> {<br class="gmail_msg">
-};<br class="gmail_msg">
+/// a placement new of any of these types.<br class="gmail_msg">
+template <typename... Ts><br class="gmail_msg">
+struct AlignedCharArrayUnion<br class="gmail_msg">
+    : llvm::AlignedCharArray<detail::max_alignof<Ts...>(),<br class="gmail_msg">
+                             detail::max_sizeof<Ts...>()> {};<br class="gmail_msg">
 } // end namespace llvm<br class="gmail_msg">
<br class="gmail_msg">
 #endif // LLVM_SUPPORT_ALIGNOF_H<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div></div>
</div></blockquote></div><br class=""></body></html>