Skip to content

Commit 298c2c6

Browse files
committed
[libcxx] [test] Clarify the condition for long double hex formatting
This test currently hardcodes which environments have got 80 bit long doubles on x86_64; add a check for the actual size of the long doubles as well. This allows waiving this part of the test, if we have x86_64 setups in any of these environments, configured for a nonstandard size of long doubles. Also clarify the exact reasons for why specific OSes such as FreeBSD are skipped for these tests.
1 parent 9604bdf commit 298c2c6

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.hex.pass.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,11 +1846,26 @@ void test1() {
18461846
void test2() {
18471847
std::locale lc = std::locale::classic();
18481848
std::locale lg(lc, new my_numpunct);
1849-
#if (defined(__APPLE__) || defined(TEST_HAS_GLIBC) || defined(__MINGW32__)) && defined(__x86_64__)
1850-
// This test is failing on FreeBSD, possibly due to different representations
1851-
// of the floating point numbers.
1852-
// This test is failing in MSVC environments, where long double is equal to regular
1853-
// double, and instead of "0x9.32c05a44p+27", this prints "0x1.26580b4880000p+30".
1849+
#if (defined(__APPLE__) || defined(TEST_HAS_GLIBC) || defined(__MINGW32__)) && defined(__x86_64__) && \
1850+
__LDBL_MANT_DIG__ == 64
1851+
// This test assumes that long doubles are x87 80 bit long doubles, and
1852+
// assumes one specific way of formatting the long doubles. (There are
1853+
// multiple valid ways of hex formatting the same float.)
1854+
//
1855+
// FreeBSD does use x87 80 bit long doubles, but normalizes the hex floats
1856+
// differently.
1857+
//
1858+
// This test assumes the form used by Glibc, Darwin and others, where the
1859+
// 64 mantissa bits are grouped by nibble as they are stored in the long
1860+
// double representation (nibble aligned at the end of the least significant
1861+
// bits). This makes 1.0L to be formatted as "0x8p-3" (where the leading
1862+
// bit of the mantissa is the higest bit in the 0x8 nibble), and makes
1863+
// __LDBL_MAX__ be formatted as "0xf.fffffffffffffffp+16380".
1864+
//
1865+
// FreeBSD normalizes/aligns the leading bit of the mantissa as a separate
1866+
// nibble, so that 1.0L is formatted as "0x1p+0" and __LDBL_MAX__ as
1867+
// "0x1.fffffffffffffffep+16383" (note the lowest bit of the last nibble
1868+
// being zero as the nibbles don't align to the actual floats).
18541869
const my_facet f(1);
18551870
char str[200];
18561871
{

0 commit comments

Comments
 (0)