summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinayak Dev <104419489+vinayakdsci@users.noreply.github.com>2024-03-29 03:48:28 +0530
committerGitHub <noreply@github.com>2024-03-28 15:18:28 -0700
commit6373577a2c72b0354b6ad6c4d1732f142aaffa80 (patch)
treefa84d9af3c14636d078ff7654ad99520ae67fb96
parent219511aee21cc652e1ede0458de4a4a66f04c81c (diff)
[libc] Add inf/nan tests for strfrom*() functions (#86663)
Adds tests for `inf` and `nan` values to the tests for `strfrom*()` functions. Also marks some variables as `[[maybe_unused]]` to silence unused variable warnings.
-rw-r--r--libc/test/src/stdlib/CMakeLists.txt1
-rw-r--r--libc/test/src/stdlib/StrfromTest.h79
2 files changed, 73 insertions, 7 deletions
diff --git a/libc/test/src/stdlib/CMakeLists.txt b/libc/test/src/stdlib/CMakeLists.txt
index 3ccc1cde9193..28c5b566cc47 100644
--- a/libc/test/src/stdlib/CMakeLists.txt
+++ b/libc/test/src/stdlib/CMakeLists.txt
@@ -174,6 +174,7 @@ add_header_library(
StrfromTest.h
DEPENDS
libc.src.__support.CPP.type_traits
+ libc.src.__support.FPUtil.fp_bits
)
add_libc_test(
diff --git a/libc/test/src/stdlib/StrfromTest.h b/libc/test/src/stdlib/StrfromTest.h
index f695bbb335bd..0db507ef0716 100644
--- a/libc/test/src/stdlib/StrfromTest.h
+++ b/libc/test/src/stdlib/StrfromTest.h
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "src/__support/CPP/type_traits.h"
+#include "src/__support/FPUtil/FPBits.h"
#include "test/UnitTest/Test.h"
#define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str) \
@@ -71,8 +72,18 @@ public:
written =
func(buff, 37,
"%A simple string with one conversion, should overwrite.", 1.0);
- ASSERT_STREQ_LEN(written, buff, is_long_double ? "0X8P-3" : "0X1P+0");
-
+ if (is_long_double) {
+#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
+ ASSERT_STREQ_LEN(written, buff, "0X8P-3");
+#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
+ ASSERT_STREQ_LEN(written, buff, "0X1P+0");
+#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
+ ASSERT_STREQ_LEN(written, buff, "0X1P+0");
+#endif
+ } else {
+ // not long double
+ ASSERT_STREQ_LEN(written, buff, "0X1P+0");
+ }
written = func(buff, 74,
"A simple string with one conversion in %A "
"between, writes string as it is",
@@ -105,6 +116,13 @@ public:
ASSERT_STREQ(buff, "1.05"); // Make sure that buff has not changed
}
+ void infNanValues(FunctionT func) {
+ if (is_double_prec)
+ doublePrecInfNan(func);
+ else if (!is_single_prec)
+ longDoublePrecInfNan(func);
+ }
+
void floatDecimalSinglePrec(FunctionT func) {
char buff[70];
int written;
@@ -336,8 +354,10 @@ public:
}
void floatDecimalExpLongDoublePrec(FunctionT func) {
- char buff[100];
- int written;
+ // Mark as maybe_unused to silence unused variable
+ // warning when long double is not 80-bit
+ [[maybe_unused]] char buff[100];
+ [[maybe_unused]] int written;
#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
written = func(buff, 90, "%.9e", 1000000000500000000.1L);
@@ -399,8 +419,10 @@ public:
}
void floatDecimalAutoLongDoublePrec(FunctionT func) {
- char buff[100];
- int written;
+ // Mark as maybe_unused to silence unused variable
+ // warning when long double is not 80-bit
+ [[maybe_unused]] char buff[100];
+ [[maybe_unused]] int written;
#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
written = func(buff, 99, "%g", 0xf.fffffffffffffffp+16380L);
@@ -413,6 +435,48 @@ public:
ASSERT_STREQ_LEN(written, buff, "1e-99");
#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80
}
+
+ void doublePrecInfNan(FunctionT func) {
+ char buff[15];
+ int written;
+
+ double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
+ double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();
+
+ written = func(buff, 10, "%f", inf);
+ ASSERT_STREQ_LEN(written, buff, "inf");
+
+ written = func(buff, 10, "%A", -inf);
+ ASSERT_STREQ_LEN(written, buff, "-INF");
+
+ written = func(buff, 10, "%f", nan);
+ ASSERT_STREQ_LEN(written, buff, "nan");
+
+ written = func(buff, 10, "%A", -nan);
+ ASSERT_STREQ_LEN(written, buff, "-NAN");
+ }
+
+ void longDoublePrecInfNan(FunctionT func) {
+ char buff[15];
+ int written;
+
+ long double ld_inf =
+ LIBC_NAMESPACE::fputil::FPBits<long double>::inf().get_val();
+ long double ld_nan =
+ LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val();
+
+ written = func(buff, 10, "%f", ld_inf);
+ ASSERT_STREQ_LEN(written, buff, "inf");
+
+ written = func(buff, 10, "%A", -ld_inf);
+ ASSERT_STREQ_LEN(written, buff, "-INF");
+
+ written = func(buff, 10, "%f", ld_nan);
+ ASSERT_STREQ_LEN(written, buff, "nan");
+
+ written = func(buff, 10, "%A", -ld_nan);
+ ASSERT_STREQ_LEN(written, buff, "-NAN");
+ }
};
#define STRFROM_TEST(InputType, name, func) \
@@ -432,4 +496,5 @@ public:
} \
TEST_F(LlvmLibc##name##Test, InsufficientBufferSize) { \
insufficentBufsize(func); \
- }
+ } \
+ TEST_F(LlvmLibc##name##Test, InfAndNanValues) { infNanValues(func); }