|
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