7
7
// ===----------------------------------------------------------------------===//
8
8
9
9
#include " src/__support/CPP/type_traits.h"
10
+ #include " src/__support/FPUtil/FPBits.h"
10
11
#include " test/UnitTest/Test.h"
11
12
12
13
#define ASSERT_STREQ_LEN (actual_written, actual_str, expected_str ) \
@@ -71,8 +72,18 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
71
72
written =
72
73
func (buff, 37 ,
73
74
" %A simple string with one conversion, should overwrite." , 1.0 );
74
- ASSERT_STREQ_LEN (written, buff, is_long_double ? " 0X8P-3" : " 0X1P+0" );
75
-
75
+ if (is_long_double) {
76
+ #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
77
+ ASSERT_STREQ_LEN (written, buff, " 0X8P-3" );
78
+ #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
79
+ ASSERT_STREQ_LEN (written, buff, " 0X1P+0" );
80
+ #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
81
+ ASSERT_STREQ_LEN (written, buff, " 0X1P+0" );
82
+ #endif
83
+ } else {
84
+ // not long double
85
+ ASSERT_STREQ_LEN (written, buff, " 0X1P+0" );
86
+ }
76
87
written = func (buff, 74 ,
77
88
" A simple string with one conversion in %A "
78
89
" between, writes string as it is" ,
@@ -105,6 +116,13 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
105
116
ASSERT_STREQ (buff, " 1.05" ); // Make sure that buff has not changed
106
117
}
107
118
119
+ void infNanValues (FunctionT func) {
120
+ if (is_double_prec)
121
+ doublePrecInfNan (func);
122
+ else if (!is_single_prec)
123
+ longDoublePrecInfNan (func);
124
+ }
125
+
108
126
void floatDecimalSinglePrec (FunctionT func) {
109
127
char buff[70 ];
110
128
int written;
@@ -336,8 +354,10 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
336
354
}
337
355
338
356
void floatDecimalExpLongDoublePrec (FunctionT func) {
339
- char buff[100 ];
340
- int written;
357
+ // Mark as maybe_unused to silence unused variable
358
+ // warning when long double is not 80-bit
359
+ [[maybe_unused]] char buff[100 ];
360
+ [[maybe_unused]] int written;
341
361
342
362
#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
343
363
written = func (buff, 90 , " %.9e" , 1000000000500000000 .1L );
@@ -399,8 +419,10 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
399
419
}
400
420
401
421
void floatDecimalAutoLongDoublePrec (FunctionT func) {
402
- char buff[100 ];
403
- int written;
422
+ // Mark as maybe_unused to silence unused variable
423
+ // warning when long double is not 80-bit
424
+ [[maybe_unused]] char buff[100 ];
425
+ [[maybe_unused]] int written;
404
426
405
427
#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
406
428
written = func (buff, 99 , " %g" , 0xf .fffffffffffffffp +16380L );
@@ -413,6 +435,48 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
413
435
ASSERT_STREQ_LEN (written, buff, " 1e-99" );
414
436
#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80
415
437
}
438
+
439
+ void doublePrecInfNan (FunctionT func) {
440
+ char buff[15 ];
441
+ int written;
442
+
443
+ double inf = LIBC_NAMESPACE::fputil::FPBits<double >::inf ().get_val ();
444
+ double nan = LIBC_NAMESPACE::fputil::FPBits<double >::quiet_nan ().get_val ();
445
+
446
+ written = func (buff, 10 , " %f" , inf);
447
+ ASSERT_STREQ_LEN (written, buff, " inf" );
448
+
449
+ written = func (buff, 10 , " %A" , -inf);
450
+ ASSERT_STREQ_LEN (written, buff, " -INF" );
451
+
452
+ written = func (buff, 10 , " %f" , nan);
453
+ ASSERT_STREQ_LEN (written, buff, " nan" );
454
+
455
+ written = func (buff, 10 , " %A" , -nan);
456
+ ASSERT_STREQ_LEN (written, buff, " -NAN" );
457
+ }
458
+
459
+ void longDoublePrecInfNan (FunctionT func) {
460
+ char buff[15 ];
461
+ int written;
462
+
463
+ long double ld_inf =
464
+ LIBC_NAMESPACE::fputil::FPBits<long double >::inf ().get_val ();
465
+ long double ld_nan =
466
+ LIBC_NAMESPACE::fputil::FPBits<long double >::quiet_nan ().get_val ();
467
+
468
+ written = func (buff, 10 , " %f" , ld_inf);
469
+ ASSERT_STREQ_LEN (written, buff, " inf" );
470
+
471
+ written = func (buff, 10 , " %A" , -ld_inf);
472
+ ASSERT_STREQ_LEN (written, buff, " -INF" );
473
+
474
+ written = func (buff, 10 , " %f" , ld_nan);
475
+ ASSERT_STREQ_LEN (written, buff, " nan" );
476
+
477
+ written = func (buff, 10 , " %A" , -ld_nan);
478
+ ASSERT_STREQ_LEN (written, buff, " -NAN" );
479
+ }
416
480
};
417
481
418
482
#define STRFROM_TEST (InputType, name, func ) \
@@ -432,4 +496,5 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
432
496
} \
433
497
TEST_F (LlvmLibc##name##Test, InsufficientBufferSize) { \
434
498
insufficentBufsize (func); \
435
- }
499
+ } \
500
+ TEST_F (LlvmLibc##name##Test, InfAndNanValues) { infNanValues (func); }
0 commit comments