|
38 | 38 | DEMANGLE_NAMESPACE_BEGIN
|
39 | 39 |
|
40 | 40 | template <class T, size_t N> class PODSmallVector {
|
41 |
| - static_assert(std::is_trivial<T>::value, |
42 |
| - "T is required to be a trivial type"); |
| 41 | + static_assert(std::is_trivially_copyable<T>::value, |
| 42 | + "T is required to be a trivially copyable type"); |
| 43 | + static_assert(std::is_trivially_default_constructible<T>::value, |
| 44 | + "T is required to be trivially default constructible"); |
43 | 45 | T *First = nullptr;
|
44 | 46 | T *Last = nullptr;
|
45 | 47 | T *Cap = nullptr;
|
@@ -5739,14 +5741,16 @@ struct FloatData<double>
|
5739 | 5741 | template <>
|
5740 | 5742 | struct FloatData<long double>
|
5741 | 5743 | {
|
5742 |
| -#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \ |
5743 |
| - defined(__wasm__) || defined(__riscv) || defined(__loongarch__) || \ |
5744 |
| - defined(__ve__) |
5745 |
| - static const size_t mangled_size = 32; |
5746 |
| -#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__) |
5747 |
| - static const size_t mangled_size = 16; |
| 5744 | +#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106 |
| 5745 | + static const size_t mangled_size = 32; |
| 5746 | +#elif __LDBL_MANT_DIG__ == 53 || defined(_MSC_VER) |
| 5747 | + // MSVC doesn't define __LDBL_MANT_DIG__, but it has long double equal to |
| 5748 | + // regular double on all current architectures. |
| 5749 | + static const size_t mangled_size = 16; |
| 5750 | +#elif __LDBL_MANT_DIG__ == 64 |
| 5751 | + static const size_t mangled_size = 20; |
5748 | 5752 | #else
|
5749 |
| - static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms |
| 5753 | +#error Unknown size for __LDBL_MANT_DIG__ |
5750 | 5754 | #endif
|
5751 | 5755 | // `-0x1.ffffffffffffffffffffffffffffp+16383` + 'L' + '\0' == 42 bytes.
|
5752 | 5756 | // 28 'f's * 4 bits == 112 bits, which is the number of mantissa bits.
|
|
0 commit comments