@@ -50,9 +50,18 @@ _LIBCPP_BEGIN_NAMESPACE_STD
50
50
// member1 - offset: 0, size: 4
51
51
// member2 - offset: 4, size: 4
52
52
// member3 - offset: 8, size: 8
53
+ //
54
+ // Furthermore, that alignment must be the same as what was used in the old __compressed_pair layout, so we must
55
+ // handle reference types specially since alignof(T&) == alignof(T). See https://github.com/llvm/llvm-project/issues/118559.
53
56
54
57
#ifndef _LIBCPP_ABI_NO_COMPRESSED_PAIR_PADDING
55
58
59
+ template <class _Tp >
60
+ struct __compressed_pair_alignment : integral_constant<size_t , _LIBCPP_ALIGNOF(_Tp)> {};
61
+
62
+ template <class _Tp >
63
+ struct __compressed_pair_alignment <_Tp&> : integral_constant<size_t , _LIBCPP_ALIGNOF(void *)> {};
64
+
56
65
template <class _ToPad ,
57
66
bool _Empty = ((is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) ||
58
67
is_reference<_ToPad>::value || sizeof (_ToPad) == __datasizeof_v<_ToPad>)>
@@ -64,14 +73,16 @@ template <class _ToPad>
64
73
class __compressed_pair_padding <_ToPad, true > {};
65
74
66
75
# define _LIBCPP_COMPRESSED_PAIR (T1, Initializer1, T2, Initializer2 ) \
67
- _LIBCPP_NO_UNIQUE_ADDRESS __attribute__ ((__aligned__(_LIBCPP_ALIGNOF(T2)))) T1 Initializer1; \
76
+ _LIBCPP_NO_UNIQUE_ADDRESS \
77
+ __attribute__ ((__aligned__(::std::__compressed_pair_alignment<T2>::value))) T1 Initializer1; \
68
78
_LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T1> _LIBCPP_CONCAT3 (__padding1_, __LINE__, _); \
69
79
_LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \
70
80
_LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T2> _LIBCPP_CONCAT3 (__padding2_, __LINE__, _)
71
81
72
82
# define _LIBCPP_COMPRESSED_TRIPLE (T1, Initializer1, T2, Initializer2, T3, Initializer3 ) \
73
83
_LIBCPP_NO_UNIQUE_ADDRESS \
74
- __attribute__ ((__aligned__(_LIBCPP_ALIGNOF(T2)), __aligned__(_LIBCPP_ALIGNOF(T3)))) T1 Initializer1; \
84
+ __attribute__ ((__aligned__(::std::__compressed_pair_alignment<T2>::value), \
85
+ __aligned__(::std::__compressed_pair_alignment<T3>::value))) T1 Initializer1; \
75
86
_LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T1> _LIBCPP_CONCAT3 (__padding1_, __LINE__, _); \
76
87
_LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \
77
88
_LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T2> _LIBCPP_CONCAT3 (__padding2_, __LINE__, _); \
0 commit comments