xref: /aosp_15_r20/external/llvm-libc/test/src/stdlib/StrfromTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- A template class for testing strfrom functions ----------*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/type_traits.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FPBits.h"
11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
12*71db0c75SAndroid Build Coastguard Worker 
13*71db0c75SAndroid Build Coastguard Worker #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str)             \
14*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1));       \
15*71db0c75SAndroid Build Coastguard Worker   EXPECT_STREQ(actual_str, expected_str);
16*71db0c75SAndroid Build Coastguard Worker 
17*71db0c75SAndroid Build Coastguard Worker template <typename InputT>
18*71db0c75SAndroid Build Coastguard Worker class StrfromTest : public LIBC_NAMESPACE::testing::Test {
19*71db0c75SAndroid Build Coastguard Worker 
20*71db0c75SAndroid Build Coastguard Worker   static const bool is_single_prec =
21*71db0c75SAndroid Build Coastguard Worker       LIBC_NAMESPACE::cpp::is_same<InputT, float>::value;
22*71db0c75SAndroid Build Coastguard Worker   static const bool is_double_prec =
23*71db0c75SAndroid Build Coastguard Worker       LIBC_NAMESPACE::cpp::is_same<InputT, double>::value;
24*71db0c75SAndroid Build Coastguard Worker 
25*71db0c75SAndroid Build Coastguard Worker   using FunctionT = int (*)(char *, size_t, const char *, InputT fp);
26*71db0c75SAndroid Build Coastguard Worker 
27*71db0c75SAndroid Build Coastguard Worker public:
floatDecimalFormat(FunctionT func)28*71db0c75SAndroid Build Coastguard Worker   void floatDecimalFormat(FunctionT func) {
29*71db0c75SAndroid Build Coastguard Worker     if (is_single_prec)
30*71db0c75SAndroid Build Coastguard Worker       floatDecimalSinglePrec(func);
31*71db0c75SAndroid Build Coastguard Worker     else if (is_double_prec)
32*71db0c75SAndroid Build Coastguard Worker       floatDecimalDoublePrec(func);
33*71db0c75SAndroid Build Coastguard Worker     else
34*71db0c75SAndroid Build Coastguard Worker       floatDecimalLongDoublePrec(func);
35*71db0c75SAndroid Build Coastguard Worker   }
36*71db0c75SAndroid Build Coastguard Worker 
floatHexExpFormat(FunctionT func)37*71db0c75SAndroid Build Coastguard Worker   void floatHexExpFormat(FunctionT func) {
38*71db0c75SAndroid Build Coastguard Worker     if (is_single_prec)
39*71db0c75SAndroid Build Coastguard Worker       floatHexExpSinglePrec(func);
40*71db0c75SAndroid Build Coastguard Worker     else if (is_double_prec)
41*71db0c75SAndroid Build Coastguard Worker       floatHexExpDoublePrec(func);
42*71db0c75SAndroid Build Coastguard Worker     else
43*71db0c75SAndroid Build Coastguard Worker       floatHexExpLongDoublePrec(func);
44*71db0c75SAndroid Build Coastguard Worker   }
45*71db0c75SAndroid Build Coastguard Worker 
floatDecimalExpFormat(FunctionT func)46*71db0c75SAndroid Build Coastguard Worker   void floatDecimalExpFormat(FunctionT func) {
47*71db0c75SAndroid Build Coastguard Worker     if (is_single_prec)
48*71db0c75SAndroid Build Coastguard Worker       floatDecimalExpSinglePrec(func);
49*71db0c75SAndroid Build Coastguard Worker     else if (is_double_prec)
50*71db0c75SAndroid Build Coastguard Worker       floatDecimalExpDoublePrec(func);
51*71db0c75SAndroid Build Coastguard Worker     else
52*71db0c75SAndroid Build Coastguard Worker       floatDecimalExpLongDoublePrec(func);
53*71db0c75SAndroid Build Coastguard Worker   }
54*71db0c75SAndroid Build Coastguard Worker 
floatDecimalAutoFormat(FunctionT func)55*71db0c75SAndroid Build Coastguard Worker   void floatDecimalAutoFormat(FunctionT func) {
56*71db0c75SAndroid Build Coastguard Worker     if (is_single_prec)
57*71db0c75SAndroid Build Coastguard Worker       floatDecimalAutoSinglePrec(func);
58*71db0c75SAndroid Build Coastguard Worker     else if (is_double_prec)
59*71db0c75SAndroid Build Coastguard Worker       floatDecimalAutoDoublePrec(func);
60*71db0c75SAndroid Build Coastguard Worker     else
61*71db0c75SAndroid Build Coastguard Worker       floatDecimalAutoLongDoublePrec(func);
62*71db0c75SAndroid Build Coastguard Worker   }
63*71db0c75SAndroid Build Coastguard Worker 
improperFormatString(FunctionT func)64*71db0c75SAndroid Build Coastguard Worker   void improperFormatString(FunctionT func) {
65*71db0c75SAndroid Build Coastguard Worker     char buff[100];
66*71db0c75SAndroid Build Coastguard Worker     int written;
67*71db0c75SAndroid Build Coastguard Worker     const bool is_long_double = !is_single_prec && !is_double_prec;
68*71db0c75SAndroid Build Coastguard Worker 
69*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 37, "A simple string with no conversions.", 1.0);
70*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "A simple string with no conversions.");
71*71db0c75SAndroid Build Coastguard Worker 
72*71db0c75SAndroid Build Coastguard Worker     written =
73*71db0c75SAndroid Build Coastguard Worker         func(buff, 37,
74*71db0c75SAndroid Build Coastguard Worker              "%A simple string with one conversion, should overwrite.", 1.0);
75*71db0c75SAndroid Build Coastguard Worker     if (is_long_double) {
76*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
77*71db0c75SAndroid Build Coastguard Worker       ASSERT_STREQ_LEN(written, buff, "0X8P-3");
78*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
79*71db0c75SAndroid Build Coastguard Worker       ASSERT_STREQ_LEN(written, buff, "0X1P+0");
80*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
81*71db0c75SAndroid Build Coastguard Worker       ASSERT_STREQ_LEN(written, buff, "0X1P+0");
82*71db0c75SAndroid Build Coastguard Worker #endif
83*71db0c75SAndroid Build Coastguard Worker     } else {
84*71db0c75SAndroid Build Coastguard Worker       // not long double
85*71db0c75SAndroid Build Coastguard Worker       ASSERT_STREQ_LEN(written, buff, "0X1P+0");
86*71db0c75SAndroid Build Coastguard Worker     }
87*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 74,
88*71db0c75SAndroid Build Coastguard Worker                    "A simple string with one conversion in %A "
89*71db0c75SAndroid Build Coastguard Worker                    "between, writes string as it is",
90*71db0c75SAndroid Build Coastguard Worker                    1.0);
91*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff,
92*71db0c75SAndroid Build Coastguard Worker                      "A simple string with one conversion in %A between, "
93*71db0c75SAndroid Build Coastguard Worker                      "writes string as it is");
94*71db0c75SAndroid Build Coastguard Worker 
95*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 36, "A simple string with one conversion", 1.0);
96*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "A simple string with one conversion");
97*71db0c75SAndroid Build Coastguard Worker 
98*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%1f", 1234567890.0);
99*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "%1f");
100*71db0c75SAndroid Build Coastguard Worker   }
101*71db0c75SAndroid Build Coastguard Worker 
insufficentBufsize(FunctionT func)102*71db0c75SAndroid Build Coastguard Worker   void insufficentBufsize(FunctionT func) {
103*71db0c75SAndroid Build Coastguard Worker     char buff[20];
104*71db0c75SAndroid Build Coastguard Worker     int written;
105*71db0c75SAndroid Build Coastguard Worker 
106*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 5, "%f", 1234567890.0);
107*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(written, 17);
108*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ(buff, "1234");
109*71db0c75SAndroid Build Coastguard Worker 
110*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 5, "%.5f", 1.05);
111*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(written, 7);
112*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ(buff, "1.05");
113*71db0c75SAndroid Build Coastguard Worker 
114*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 0, "%g", 1.0);
115*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(written, 1);
116*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ(buff, "1.05"); // Make sure that buff has not changed
117*71db0c75SAndroid Build Coastguard Worker   }
118*71db0c75SAndroid Build Coastguard Worker 
infNanValues(FunctionT func)119*71db0c75SAndroid Build Coastguard Worker   void infNanValues(FunctionT func) {
120*71db0c75SAndroid Build Coastguard Worker     if (is_double_prec)
121*71db0c75SAndroid Build Coastguard Worker       doublePrecInfNan(func);
122*71db0c75SAndroid Build Coastguard Worker     else if (!is_single_prec)
123*71db0c75SAndroid Build Coastguard Worker       longDoublePrecInfNan(func);
124*71db0c75SAndroid Build Coastguard Worker   }
125*71db0c75SAndroid Build Coastguard Worker 
floatDecimalSinglePrec(FunctionT func)126*71db0c75SAndroid Build Coastguard Worker   void floatDecimalSinglePrec(FunctionT func) {
127*71db0c75SAndroid Build Coastguard Worker     char buff[70];
128*71db0c75SAndroid Build Coastguard Worker     int written;
129*71db0c75SAndroid Build Coastguard Worker 
130*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 16, "%f", 1.0);
131*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000");
132*71db0c75SAndroid Build Coastguard Worker 
133*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%f", 1234567890.0);
134*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1234567936.000000");
135*71db0c75SAndroid Build Coastguard Worker 
136*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 67, "%.3f", 1.0);
137*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000");
138*71db0c75SAndroid Build Coastguard Worker   }
139*71db0c75SAndroid Build Coastguard Worker 
floatDecimalDoublePrec(FunctionT func)140*71db0c75SAndroid Build Coastguard Worker   void floatDecimalDoublePrec(FunctionT func) {
141*71db0c75SAndroid Build Coastguard Worker     char buff[500];
142*71db0c75SAndroid Build Coastguard Worker     int written;
143*71db0c75SAndroid Build Coastguard Worker 
144*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 1.0);
145*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000");
146*71db0c75SAndroid Build Coastguard Worker 
147*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%F", -1.0);
148*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-1.000000");
149*71db0c75SAndroid Build Coastguard Worker 
150*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", -1.234567);
151*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-1.234567");
152*71db0c75SAndroid Build Coastguard Worker 
153*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 0.0);
154*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.000000");
155*71db0c75SAndroid Build Coastguard Worker 
156*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 1.5);
157*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.500000");
158*71db0c75SAndroid Build Coastguard Worker 
159*71db0c75SAndroid Build Coastguard Worker // Dyadic float is only accurate to ~50 digits, so skip this 300 digit test.
160*71db0c75SAndroid Build Coastguard Worker // TODO: Create way to test just the first ~50 digits of a number.
161*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
162*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 499, "%f", 1e300);
163*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff,
164*71db0c75SAndroid Build Coastguard Worker                      "100000000000000005250476025520442024870446858110815915491"
165*71db0c75SAndroid Build Coastguard Worker                      "585411551180245"
166*71db0c75SAndroid Build Coastguard Worker                      "798890819578637137508044786404370444383288387817694252323"
167*71db0c75SAndroid Build Coastguard Worker                      "536043057564479"
168*71db0c75SAndroid Build Coastguard Worker                      "218478670698284838720092657580373783023379478809005936895"
169*71db0c75SAndroid Build Coastguard Worker                      "323497079994508"
170*71db0c75SAndroid Build Coastguard Worker                      "111903896764088007465274278014249457925878882005684283811"
171*71db0c75SAndroid Build Coastguard Worker                      "566947219638686"
172*71db0c75SAndroid Build Coastguard Worker                      "5459400540160.000000");
173*71db0c75SAndroid Build Coastguard Worker #endif // DLIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
174*71db0c75SAndroid Build Coastguard Worker 
175*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 0.1);
176*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.100000");
177*71db0c75SAndroid Build Coastguard Worker 
178*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 1234567890123456789.0);
179*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000");
180*71db0c75SAndroid Build Coastguard Worker 
181*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 9999999999999.99);
182*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "9999999999999.990234");
183*71db0c75SAndroid Build Coastguard Worker 
184*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 0.1);
185*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.100000");
186*71db0c75SAndroid Build Coastguard Worker 
187*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 1234567890123456789.0);
188*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000");
189*71db0c75SAndroid Build Coastguard Worker 
190*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%f", 9999999999999.99);
191*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "9999999999999.990234");
192*71db0c75SAndroid Build Coastguard Worker 
193*71db0c75SAndroid Build Coastguard Worker     // Precision Tests
194*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.2f", 9999999999999.99);
195*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "9999999999999.99");
196*71db0c75SAndroid Build Coastguard Worker 
197*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.1f", 9999999999999.99);
198*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "10000000000000.0");
199*71db0c75SAndroid Build Coastguard Worker 
200*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.5f", 1.25);
201*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.25000");
202*71db0c75SAndroid Build Coastguard Worker 
203*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.0f", 1.25);
204*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1");
205*71db0c75SAndroid Build Coastguard Worker 
206*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.20f", 1.234e-10);
207*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.00000000012340000000");
208*71db0c75SAndroid Build Coastguard Worker   }
209*71db0c75SAndroid Build Coastguard Worker 
floatDecimalLongDoublePrec(FunctionT func)210*71db0c75SAndroid Build Coastguard Worker   void floatDecimalLongDoublePrec(FunctionT func) {
211*71db0c75SAndroid Build Coastguard Worker     char buff[45];
212*71db0c75SAndroid Build Coastguard Worker     int written;
213*71db0c75SAndroid Build Coastguard Worker 
214*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 40, "%f", 1.0L);
215*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000");
216*71db0c75SAndroid Build Coastguard Worker 
217*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%.f", -2.5L);
218*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-2");
219*71db0c75SAndroid Build Coastguard Worker   }
220*71db0c75SAndroid Build Coastguard Worker 
floatHexExpSinglePrec(FunctionT func)221*71db0c75SAndroid Build Coastguard Worker   void floatHexExpSinglePrec(FunctionT func) {
222*71db0c75SAndroid Build Coastguard Worker     char buff[25];
223*71db0c75SAndroid Build Coastguard Worker     int written;
224*71db0c75SAndroid Build Coastguard Worker 
225*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 0, "%a", 1234567890.0);
226*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(written, 14);
227*71db0c75SAndroid Build Coastguard Worker 
228*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%a", 1234567890.0);
229*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(written, 14);
230*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ(buff, "0x1.26580cp+30");
231*71db0c75SAndroid Build Coastguard Worker 
232*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%A", 1234567890.0);
233*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(written, 14);
234*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ(buff, "0X1.26580CP+30");
235*71db0c75SAndroid Build Coastguard Worker   }
236*71db0c75SAndroid Build Coastguard Worker 
floatHexExpDoublePrec(FunctionT func)237*71db0c75SAndroid Build Coastguard Worker   void floatHexExpDoublePrec(FunctionT func) {
238*71db0c75SAndroid Build Coastguard Worker     char buff[60];
239*71db0c75SAndroid Build Coastguard Worker     int written;
240*71db0c75SAndroid Build Coastguard Worker 
241*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%a", 1.0);
242*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1p+0");
243*71db0c75SAndroid Build Coastguard Worker 
244*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%A", -1.0);
245*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-0X1P+0");
246*71db0c75SAndroid Build Coastguard Worker 
247*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 30, "%a", -0x1.abcdef12345p0);
248*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0");
249*71db0c75SAndroid Build Coastguard Worker 
250*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 50, "%A", 0x1.abcdef12345p0);
251*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0");
252*71db0c75SAndroid Build Coastguard Worker 
253*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%a", 0.0);
254*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x0p+0");
255*71db0c75SAndroid Build Coastguard Worker 
256*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 40, "%a", 1.0e100);
257*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332");
258*71db0c75SAndroid Build Coastguard Worker 
259*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 30, "%a", 0.1);
260*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");
261*71db0c75SAndroid Build Coastguard Worker   }
262*71db0c75SAndroid Build Coastguard Worker 
floatHexExpLongDoublePrec(FunctionT func)263*71db0c75SAndroid Build Coastguard Worker   void floatHexExpLongDoublePrec(FunctionT func) {
264*71db0c75SAndroid Build Coastguard Worker     char buff[55];
265*71db0c75SAndroid Build Coastguard Worker     int written;
266*71db0c75SAndroid Build Coastguard Worker 
267*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 50, "%a", 0.1L);
268*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
269*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7");
270*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
271*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");
272*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
273*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4");
274*71db0c75SAndroid Build Coastguard Worker #endif
275*71db0c75SAndroid Build Coastguard Worker 
276*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%.1a", 0.1L);
277*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
278*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0xc.dp-7");
279*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
280*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
281*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
282*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
283*71db0c75SAndroid Build Coastguard Worker #endif
284*71db0c75SAndroid Build Coastguard Worker 
285*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 50, "%a", 1.0e1000L);
286*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
287*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318");
288*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
289*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "inf");
290*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
291*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321");
292*71db0c75SAndroid Build Coastguard Worker #endif
293*71db0c75SAndroid Build Coastguard Worker 
294*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 50, "%a", 1.0e-1000L);
295*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
296*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325");
297*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
298*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x0p+0");
299*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
300*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322");
301*71db0c75SAndroid Build Coastguard Worker #endif
302*71db0c75SAndroid Build Coastguard Worker 
303*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 50, "%.1a", 0xf.fffffffffffffffp16380L);
304*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
305*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384");
306*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
307*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "inf");
308*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
309*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383");
310*71db0c75SAndroid Build Coastguard Worker #endif
311*71db0c75SAndroid Build Coastguard Worker   }
312*71db0c75SAndroid Build Coastguard Worker 
floatDecimalExpSinglePrec(FunctionT func)313*71db0c75SAndroid Build Coastguard Worker   void floatDecimalExpSinglePrec(FunctionT func) {
314*71db0c75SAndroid Build Coastguard Worker     char buff[25];
315*71db0c75SAndroid Build Coastguard Worker     int written;
316*71db0c75SAndroid Build Coastguard Worker 
317*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%.9e", 1234567890.0);
318*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.234567936e+09");
319*71db0c75SAndroid Build Coastguard Worker 
320*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%.9E", 1234567890.0);
321*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.234567936E+09");
322*71db0c75SAndroid Build Coastguard Worker   }
323*71db0c75SAndroid Build Coastguard Worker 
floatDecimalExpDoublePrec(FunctionT func)324*71db0c75SAndroid Build Coastguard Worker   void floatDecimalExpDoublePrec(FunctionT func) {
325*71db0c75SAndroid Build Coastguard Worker     char buff[101];
326*71db0c75SAndroid Build Coastguard Worker     int written;
327*71db0c75SAndroid Build Coastguard Worker 
328*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%e", 1.0);
329*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000e+00");
330*71db0c75SAndroid Build Coastguard Worker 
331*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%E", -1.0);
332*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-1.000000E+00");
333*71db0c75SAndroid Build Coastguard Worker 
334*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%e", -1.234567);
335*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-1.234567e+00");
336*71db0c75SAndroid Build Coastguard Worker 
337*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%e", 0.0);
338*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.000000e+00");
339*71db0c75SAndroid Build Coastguard Worker 
340*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%e", 1.5);
341*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.500000e+00");
342*71db0c75SAndroid Build Coastguard Worker 
343*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%e", 1e300);
344*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000e+300");
345*71db0c75SAndroid Build Coastguard Worker 
346*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%e", 1234567890123456789.0);
347*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.234568e+18");
348*71db0c75SAndroid Build Coastguard Worker 
349*71db0c75SAndroid Build Coastguard Worker     // Precision Tests
350*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.1e", 1.0);
351*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.0e+00");
352*71db0c75SAndroid Build Coastguard Worker 
353*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.1e", 1.99);
354*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "2.0e+00");
355*71db0c75SAndroid Build Coastguard Worker 
356*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.1e", 9.99);
357*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.0e+01");
358*71db0c75SAndroid Build Coastguard Worker   }
359*71db0c75SAndroid Build Coastguard Worker 
floatDecimalExpLongDoublePrec(FunctionT func)360*71db0c75SAndroid Build Coastguard Worker   void floatDecimalExpLongDoublePrec(FunctionT func) {
361*71db0c75SAndroid Build Coastguard Worker     // Mark as maybe_unused to silence unused variable
362*71db0c75SAndroid Build Coastguard Worker     // warning when long double is not 80-bit
363*71db0c75SAndroid Build Coastguard Worker     [[maybe_unused]] char buff[100];
364*71db0c75SAndroid Build Coastguard Worker     [[maybe_unused]] int written;
365*71db0c75SAndroid Build Coastguard Worker 
366*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
367*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 90, "%.9e", 1000000000500000000.1L);
368*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000001e+18");
369*71db0c75SAndroid Build Coastguard Worker 
370*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 90, "%.9e", 1000000000500000000.0L);
371*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.000000000e+18");
372*71db0c75SAndroid Build Coastguard Worker 
373*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 90, "%e", 0xf.fffffffffffffffp+16380L);
374*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.189731e+4932");
375*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80
376*71db0c75SAndroid Build Coastguard Worker   }
377*71db0c75SAndroid Build Coastguard Worker 
floatDecimalAutoSinglePrec(FunctionT func)378*71db0c75SAndroid Build Coastguard Worker   void floatDecimalAutoSinglePrec(FunctionT func) {
379*71db0c75SAndroid Build Coastguard Worker     char buff[25];
380*71db0c75SAndroid Build Coastguard Worker     int written;
381*71db0c75SAndroid Build Coastguard Worker 
382*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%.9g", 1234567890.0);
383*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.23456794e+09");
384*71db0c75SAndroid Build Coastguard Worker 
385*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 20, "%.9G", 1234567890.0);
386*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.23456794E+09");
387*71db0c75SAndroid Build Coastguard Worker   }
388*71db0c75SAndroid Build Coastguard Worker 
floatDecimalAutoDoublePrec(FunctionT func)389*71db0c75SAndroid Build Coastguard Worker   void floatDecimalAutoDoublePrec(FunctionT func) {
390*71db0c75SAndroid Build Coastguard Worker     char buff[120];
391*71db0c75SAndroid Build Coastguard Worker     int written;
392*71db0c75SAndroid Build Coastguard Worker 
393*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%g", 1234567890123456789.0);
394*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.23457e+18");
395*71db0c75SAndroid Build Coastguard Worker 
396*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%g", 9999990000000.00);
397*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "9.99999e+12");
398*71db0c75SAndroid Build Coastguard Worker 
399*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%g", 9999999000000.00);
400*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1e+13");
401*71db0c75SAndroid Build Coastguard Worker 
402*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%g", 0xa.aaaaaaaaaaaaaabp-7);
403*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.0833333");
404*71db0c75SAndroid Build Coastguard Worker 
405*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%g", 0.00001);
406*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1e-05");
407*71db0c75SAndroid Build Coastguard Worker 
408*71db0c75SAndroid Build Coastguard Worker     // Precision Tests
409*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.0g", 0.0);
410*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0");
411*71db0c75SAndroid Build Coastguard Worker 
412*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.2g", 0.1);
413*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.1");
414*71db0c75SAndroid Build Coastguard Worker 
415*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.2g", 1.09);
416*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.1");
417*71db0c75SAndroid Build Coastguard Worker 
418*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.15g", 22.25);
419*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "22.25");
420*71db0c75SAndroid Build Coastguard Worker 
421*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 100, "%.20g", 1.234e-10);
422*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.2340000000000000814e-10");
423*71db0c75SAndroid Build Coastguard Worker   }
424*71db0c75SAndroid Build Coastguard Worker 
floatDecimalAutoLongDoublePrec(FunctionT func)425*71db0c75SAndroid Build Coastguard Worker   void floatDecimalAutoLongDoublePrec(FunctionT func) {
426*71db0c75SAndroid Build Coastguard Worker     // Mark as maybe_unused to silence unused variable
427*71db0c75SAndroid Build Coastguard Worker     // warning when long double is not 80-bit
428*71db0c75SAndroid Build Coastguard Worker     [[maybe_unused]] char buff[100];
429*71db0c75SAndroid Build Coastguard Worker     [[maybe_unused]] int written;
430*71db0c75SAndroid Build Coastguard Worker 
431*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
432*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%g", 0xf.fffffffffffffffp+16380L);
433*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1.18973e+4932");
434*71db0c75SAndroid Build Coastguard Worker 
435*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%g", 0xa.aaaaaaaaaaaaaabp-7L);
436*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "0.0833333");
437*71db0c75SAndroid Build Coastguard Worker 
438*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 99, "%g", 9.99999999999e-100L);
439*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "1e-99");
440*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80
441*71db0c75SAndroid Build Coastguard Worker   }
442*71db0c75SAndroid Build Coastguard Worker 
doublePrecInfNan(FunctionT func)443*71db0c75SAndroid Build Coastguard Worker   void doublePrecInfNan(FunctionT func) {
444*71db0c75SAndroid Build Coastguard Worker     char buff[15];
445*71db0c75SAndroid Build Coastguard Worker     int written;
446*71db0c75SAndroid Build Coastguard Worker 
447*71db0c75SAndroid Build Coastguard Worker     double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
448*71db0c75SAndroid Build Coastguard Worker     double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();
449*71db0c75SAndroid Build Coastguard Worker 
450*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%f", inf);
451*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "inf");
452*71db0c75SAndroid Build Coastguard Worker 
453*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%A", -inf);
454*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-INF");
455*71db0c75SAndroid Build Coastguard Worker 
456*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%f", nan);
457*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "nan");
458*71db0c75SAndroid Build Coastguard Worker 
459*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%A", -nan);
460*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-NAN");
461*71db0c75SAndroid Build Coastguard Worker   }
462*71db0c75SAndroid Build Coastguard Worker 
longDoublePrecInfNan(FunctionT func)463*71db0c75SAndroid Build Coastguard Worker   void longDoublePrecInfNan(FunctionT func) {
464*71db0c75SAndroid Build Coastguard Worker     char buff[15];
465*71db0c75SAndroid Build Coastguard Worker     int written;
466*71db0c75SAndroid Build Coastguard Worker 
467*71db0c75SAndroid Build Coastguard Worker     long double ld_inf =
468*71db0c75SAndroid Build Coastguard Worker         LIBC_NAMESPACE::fputil::FPBits<long double>::inf().get_val();
469*71db0c75SAndroid Build Coastguard Worker     long double ld_nan =
470*71db0c75SAndroid Build Coastguard Worker         LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val();
471*71db0c75SAndroid Build Coastguard Worker 
472*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%f", ld_inf);
473*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "inf");
474*71db0c75SAndroid Build Coastguard Worker 
475*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%A", -ld_inf);
476*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-INF");
477*71db0c75SAndroid Build Coastguard Worker 
478*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%f", ld_nan);
479*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "nan");
480*71db0c75SAndroid Build Coastguard Worker 
481*71db0c75SAndroid Build Coastguard Worker     written = func(buff, 10, "%A", -ld_nan);
482*71db0c75SAndroid Build Coastguard Worker     ASSERT_STREQ_LEN(written, buff, "-NAN");
483*71db0c75SAndroid Build Coastguard Worker   }
484*71db0c75SAndroid Build Coastguard Worker };
485*71db0c75SAndroid Build Coastguard Worker 
486*71db0c75SAndroid Build Coastguard Worker #define STRFROM_TEST(InputType, name, func)                                    \
487*71db0c75SAndroid Build Coastguard Worker   using LlvmLibc##name##Test = StrfromTest<InputType>;                         \
488*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, FloatDecimalFormat) {                           \
489*71db0c75SAndroid Build Coastguard Worker     floatDecimalFormat(func);                                                  \
490*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
491*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, FloatHexExpFormat) { floatHexExpFormat(func); } \
492*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, FloatDecimalAutoFormat) {                       \
493*71db0c75SAndroid Build Coastguard Worker     floatDecimalAutoFormat(func);                                              \
494*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
495*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, FloatDecimalExpFormat) {                        \
496*71db0c75SAndroid Build Coastguard Worker     floatDecimalExpFormat(func);                                               \
497*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
498*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, ImproperFormatString) {                         \
499*71db0c75SAndroid Build Coastguard Worker     improperFormatString(func);                                                \
500*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
501*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, InsufficientBufferSize) {                       \
502*71db0c75SAndroid Build Coastguard Worker     insufficentBufsize(func);                                                  \
503*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
504*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibc##name##Test, InfAndNanValues) { infNanValues(func); }
505