|
57 | 57 | namespace llvm { |
58 | 58 |
|
59 | 59 | namespace trailing_objects_internal { |
60 | | -/// Helper template to calculate the max alignment requirement for a set of |
61 | | -/// objects. |
62 | | -template <typename First, typename... Rest> class AlignmentCalcHelper { |
63 | | -private: |
64 | | - enum { |
65 | | - FirstAlignment = alignof(First), |
66 | | - RestAlignment = AlignmentCalcHelper<Rest...>::Alignment, |
67 | | - }; |
68 | 60 |
|
69 | | -public: |
70 | | - enum { |
71 | | - Alignment = FirstAlignment > RestAlignment ? FirstAlignment : RestAlignment |
72 | | - }; |
73 | | -}; |
74 | | - |
75 | | -template <typename First> class AlignmentCalcHelper<First> { |
76 | | -public: |
77 | | - enum { Alignment = alignof(First) }; |
78 | | -}; |
| 61 | +template <typename... T> |
| 62 | +inline constexpr size_t MaxAlignment = std::max({alignof(T)...}); |
79 | 63 |
|
80 | 64 | /// The base class for TrailingObjects* classes. |
81 | 65 | class TrailingObjectsBase { |
@@ -209,20 +193,19 @@ class alignas(Align) TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, PrevTy> |
209 | 193 | /// See the file comment for details on the usage of the |
210 | 194 | /// TrailingObjects type. |
211 | 195 | template <typename BaseTy, typename... TrailingTys> |
212 | | -class TrailingObjects : private trailing_objects_internal::TrailingObjectsImpl< |
213 | | - trailing_objects_internal::AlignmentCalcHelper< |
214 | | - TrailingTys...>::Alignment, |
215 | | - BaseTy, TrailingObjects<BaseTy, TrailingTys...>, |
216 | | - BaseTy, TrailingTys...> { |
| 196 | +class TrailingObjects |
| 197 | + : private trailing_objects_internal::TrailingObjectsImpl< |
| 198 | + trailing_objects_internal::MaxAlignment<TrailingTys...>, BaseTy, |
| 199 | + TrailingObjects<BaseTy, TrailingTys...>, BaseTy, TrailingTys...> { |
217 | 200 |
|
218 | 201 | template <int A, typename B, typename T, typename P, typename... M> |
219 | 202 | friend class trailing_objects_internal::TrailingObjectsImpl; |
220 | 203 |
|
221 | 204 | template <typename... Tys> class Foo {}; |
222 | 205 |
|
223 | 206 | typedef trailing_objects_internal::TrailingObjectsImpl< |
224 | | - trailing_objects_internal::AlignmentCalcHelper<TrailingTys...>::Alignment, |
225 | | - BaseTy, TrailingObjects<BaseTy, TrailingTys...>, BaseTy, TrailingTys...> |
| 207 | + trailing_objects_internal::MaxAlignment<TrailingTys...>, BaseTy, |
| 208 | + TrailingObjects<BaseTy, TrailingTys...>, BaseTy, TrailingTys...> |
226 | 209 | ParentType; |
227 | 210 | using TrailingObjectsBase = trailing_objects_internal::TrailingObjectsBase; |
228 | 211 |
|
|
0 commit comments