brintos

brintos / llvm-project-archived public Read only

0
0
Text · 136.0 KiB · 42fdd59 Raw
3478 lines · cpp
1//===-- Unittests for sprintf ---------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/macros/config.h"10#include "src/stdio/sprintf.h"11 12#include "src/__support/FPUtil/FPBits.h"13#include "src/__support/libc_errno.h"14#include "test/UnitTest/RoundingModeUtils.h"15#include "test/UnitTest/Test.h"16#include <inttypes.h>17 18// TODO: Add a comment here explaining the printf format string.19 20// #include <stdio.h>21// namespace LIBC_NAMESPACE_DECL {22// using ::sprintf;23// }24 25using LIBC_NAMESPACE::fputil::testing::ForceRoundingMode;26using LIBC_NAMESPACE::fputil::testing::RoundingMode;27 28// Subtract 1 from sizeof(expected_str) to account for the null byte.29#define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str)             \30  EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1));       \31  EXPECT_STREQ(actual_str, expected_str);32 33#define macro_test(FMT, X, expected)                                           \34  do {                                                                         \35    for (char &c : buff) {                                                     \36      c = 0;                                                                   \37    }                                                                          \38    written = LIBC_NAMESPACE::sprintf(buff, "%" FMT, X);                       \39    ASSERT_STREQ_LEN(written, buff, expected);                                 \40  } while (0)41 42TEST(LlvmLibcSPrintfTest, Macros) {43  char buff[128];44  int written;45  macro_test(PRIu8, 1, "1");46  macro_test(PRIX16, 0xAA, "AA");47  macro_test(PRId32, -123, "-123");48  macro_test(PRIX32, 0xFFFFFF85, "FFFFFF85");49  macro_test(PRIo8, 0xFF, "377");50  macro_test(PRIo64, 0123456712345671234567ll, "123456712345671234567");51}52 53TEST(LlvmLibcSPrintfTest, SimpleNoConv) {54  char buff[64];55  int written;56 57  written =58      LIBC_NAMESPACE::sprintf(buff, "A simple string with no conversions.");59  ASSERT_STREQ_LEN(written, buff, "A simple string with no conversions.");60}61 62TEST(LlvmLibcSPrintfTest, PercentConv) {63  char buff[64];64  int written;65 66  written = LIBC_NAMESPACE::sprintf(buff, "%%");67  ASSERT_STREQ_LEN(written, buff, "%");68 69  written = LIBC_NAMESPACE::sprintf(buff, "abc %% def");70  ASSERT_STREQ_LEN(written, buff, "abc % def");71 72  written = LIBC_NAMESPACE::sprintf(buff, "%%%%%%");73  ASSERT_STREQ_LEN(written, buff, "%%%");74}75 76TEST(LlvmLibcSPrintfTest, CharConv) {77  char buff[64];78  int written;79 80  written = LIBC_NAMESPACE::sprintf(buff, "%c", 'a');81  ASSERT_STREQ_LEN(written, buff, "a");82 83  written = LIBC_NAMESPACE::sprintf(buff, "%3c %-3c", '1', '2');84  ASSERT_STREQ_LEN(written, buff, "  1 2  ");85 86  written = LIBC_NAMESPACE::sprintf(buff, "%*c", 2, '3');87  ASSERT_STREQ_LEN(written, buff, " 3");88}89 90TEST(LlvmLibcSPrintfTest, StringConv) {91  char buff[64];92  int written;93 94  written = LIBC_NAMESPACE::sprintf(buff, "%s", "abcDEF123");95  ASSERT_STREQ_LEN(written, buff, "abcDEF123");96 97  written = LIBC_NAMESPACE::sprintf(buff, "%10s %-10s", "centered", "title");98  ASSERT_STREQ_LEN(written, buff, "  centered title     ");99 100  written = LIBC_NAMESPACE::sprintf(buff, "%-5.4s%-4.4s", "words can describe",101                                    "soups most delicious");102  ASSERT_STREQ_LEN(written, buff, "word soup");103 104  written = LIBC_NAMESPACE::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2,105                                    "isn't", 12, 10, "important. Ever.");106  ASSERT_STREQ_LEN(written, buff, " beginning is   important.");107 108#ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS109  written = LIBC_NAMESPACE::sprintf(buff, "%s", nullptr);110  ASSERT_STREQ_LEN(written, buff, "(null)");111#endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS112}113 114TEST(LlvmLibcSPrintfTest, IntConv) {115  char buff[64];116  int written;117 118  // Basic Tests.119 120  written = LIBC_NAMESPACE::sprintf(buff, "%d", 123);121  ASSERT_STREQ_LEN(written, buff, "123");122 123  written = LIBC_NAMESPACE::sprintf(buff, "%i", -456);124  ASSERT_STREQ_LEN(written, buff, "-456");125 126  // Length Modifier Tests.127 128  written = LIBC_NAMESPACE::sprintf(buff, "%hhu", 257); // 0x101129  ASSERT_STREQ_LEN(written, buff, "1");130 131  written = LIBC_NAMESPACE::sprintf(buff, "%llu", 18446744073709551615ull);132  ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max133 134  written = LIBC_NAMESPACE::sprintf(buff, "%u", ~0);135  if (sizeof(int) == 4) {136    ASSERT_STREQ_LEN(written, buff, "4294967295");137  }138 139  written = LIBC_NAMESPACE::sprintf(buff, "%tu", ~ptrdiff_t(0));140  if (sizeof(ptrdiff_t) == 8) {141    ASSERT_STREQ_LEN(written, buff, "18446744073709551615");142  } else if (sizeof(ptrdiff_t) == 4) {143    ASSERT_STREQ_LEN(written, buff, "4294967295");144  }145 146  written = LIBC_NAMESPACE::sprintf(buff, "%lld", -9223372036854775807ll - 1ll);147  ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min148 149  written = LIBC_NAMESPACE::sprintf(buff, "%w3d", 5807);150  ASSERT_STREQ_LEN(written, buff, "7");151 152  written = LIBC_NAMESPACE::sprintf(buff, "%w3d", 1);153  ASSERT_STREQ_LEN(written, buff, "1");154 155  written = LIBC_NAMESPACE::sprintf(buff, "%w64d", 9223372036854775807ll);156  ASSERT_STREQ_LEN(written, buff, "9223372036854775807");157 158  written = LIBC_NAMESPACE::sprintf(buff, "%w-1d", 5807);159  ASSERT_STREQ_LEN(written, buff, "%w-1d");160 161  written = LIBC_NAMESPACE::sprintf(buff, "%w0d", 5807);162  ASSERT_STREQ_LEN(written, buff, "%w0d");163 164  written = LIBC_NAMESPACE::sprintf(buff, "%w999d", 9223372036854775807ll);165  ASSERT_STREQ_LEN(written, buff, "9223372036854775807");166 167  written = LIBC_NAMESPACE::sprintf(buff, "%winvalid%w1d", 5807, 5807);168  ASSERT_STREQ_LEN(written, buff, "%winvalid1");169 170  written = LIBC_NAMESPACE::sprintf(buff, "%w-1d%w1d", 5807, 5807);171  ASSERT_STREQ_LEN(written, buff, "%w-1d1");172 173  char format[64];174  char uintmax[128];175  LIBC_NAMESPACE::sprintf(format, "%%w%du", sizeof(uintmax_t) * CHAR_BIT);176  const int uintmax_len =177      LIBC_NAMESPACE::sprintf(uintmax, "%ju", sizeof(uintmax_t) * CHAR_BIT);178  written = LIBC_NAMESPACE::sprintf(buff, format, sizeof(uintmax_t) * CHAR_BIT);179  EXPECT_EQ(written, uintmax_len);180  ASSERT_STREQ(buff, uintmax);181 182  written = LIBC_NAMESPACE::sprintf(buff, "%w64u", 18446744073709551615ull);183  ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max184 185  written =186      LIBC_NAMESPACE::sprintf(buff, "%w64d", -9223372036854775807ll - 1ll);187  ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min188 189  written = LIBC_NAMESPACE::sprintf(buff, "%wf3d", 5807);190  ASSERT_STREQ_LEN(written, buff, "7");191 192  written = LIBC_NAMESPACE::sprintf(buff, "%wf3d", 1);193  ASSERT_STREQ_LEN(written, buff, "1");194 195  written = LIBC_NAMESPACE::sprintf(buff, "%wf64u", 18446744073709551615ull);196  ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max197 198  written =199      LIBC_NAMESPACE::sprintf(buff, "%wf64d", -9223372036854775807ll - 1ll);200  ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min201 202  written = LIBC_NAMESPACE::sprintf(buff, "%wf0d", 5807);203  ASSERT_STREQ_LEN(written, buff, "%wf0d");204 205  written = LIBC_NAMESPACE::sprintf(buff, "%wf-1d", 5807);206  ASSERT_STREQ_LEN(written, buff, "%wf-1d");207 208  written = LIBC_NAMESPACE::sprintf(buff, "%wfinvalid%wf1d", 5807, 5807);209  ASSERT_STREQ_LEN(written, buff, "%wfinvalid1");210 211  written = LIBC_NAMESPACE::sprintf(buff, "%wf-1d%wf1d", 5807, 5807);212  ASSERT_STREQ_LEN(written, buff, "%wf-1d1");213 214  written = LIBC_NAMESPACE::sprintf(buff, "%wf999d", 9223372036854775807ll);215  ASSERT_STREQ_LEN(written, buff, "9223372036854775807");216 217  // Min Width Tests.218 219  written = LIBC_NAMESPACE::sprintf(buff, "%4d", 789);220  ASSERT_STREQ_LEN(written, buff, " 789");221 222  written = LIBC_NAMESPACE::sprintf(buff, "%2d", 987);223  ASSERT_STREQ_LEN(written, buff, "987");224 225  // Precision Tests.226 227  written = LIBC_NAMESPACE::sprintf(buff, "%d", 0);228  ASSERT_STREQ_LEN(written, buff, "0");229 230  written = LIBC_NAMESPACE::sprintf(buff, "%.0d", 0);231  ASSERT_STREQ_LEN(written, buff, "");232 233  written = LIBC_NAMESPACE::sprintf(buff, "%.5d", 654);234  ASSERT_STREQ_LEN(written, buff, "00654");235 236  written = LIBC_NAMESPACE::sprintf(buff, "%.5d", -321);237  ASSERT_STREQ_LEN(written, buff, "-00321");238 239  written = LIBC_NAMESPACE::sprintf(buff, "%.2d", 135);240  ASSERT_STREQ_LEN(written, buff, "135");241 242  // Flag Tests.243 244  written = LIBC_NAMESPACE::sprintf(buff, "%.5d", -321);245  ASSERT_STREQ_LEN(written, buff, "-00321");246 247  written = LIBC_NAMESPACE::sprintf(buff, "%-5d", 246);248  ASSERT_STREQ_LEN(written, buff, "246  ");249 250  written = LIBC_NAMESPACE::sprintf(buff, "%-5d", -147);251  ASSERT_STREQ_LEN(written, buff, "-147 ");252 253  written = LIBC_NAMESPACE::sprintf(buff, "%+d", 258);254  ASSERT_STREQ_LEN(written, buff, "+258");255 256  written = LIBC_NAMESPACE::sprintf(buff, "% d", 369);257  ASSERT_STREQ_LEN(written, buff, " 369");258 259  written = LIBC_NAMESPACE::sprintf(buff, "%05d", 470);260  ASSERT_STREQ_LEN(written, buff, "00470");261 262  written = LIBC_NAMESPACE::sprintf(buff, "%05d", -581);263  ASSERT_STREQ_LEN(written, buff, "-0581");264 265  // Combined Tests.266 267  written = LIBC_NAMESPACE::sprintf(buff, "%+ u", 692);268  ASSERT_STREQ_LEN(written, buff, "692");269 270  written = LIBC_NAMESPACE::sprintf(buff, "%+ -05d", 703);271  ASSERT_STREQ_LEN(written, buff, "+703 ");272 273  written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", 814);274  ASSERT_STREQ_LEN(written, buff, "  00814");275 276  written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", -925);277  ASSERT_STREQ_LEN(written, buff, " -00925");278 279  written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", 159);280  ASSERT_STREQ_LEN(written, buff, "  00159");281 282  written = LIBC_NAMESPACE::sprintf(buff, "% -7.5d", 260);283  ASSERT_STREQ_LEN(written, buff, " 00260 ");284 285  written = LIBC_NAMESPACE::sprintf(buff, "%5.4d", 10000);286  ASSERT_STREQ_LEN(written, buff, "10000");287 288  // Multiple Conversion Tests.289 290  written = LIBC_NAMESPACE::sprintf(buff, "%10d %-10d", 456, -789);291  ASSERT_STREQ_LEN(written, buff, "       456 -789      ");292 293  written = LIBC_NAMESPACE::sprintf(buff, "%-5.4d%+.4u", 75, 25);294  ASSERT_STREQ_LEN(written, buff, "0075 0025");295 296  written = LIBC_NAMESPACE::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd",297                                    256 + 127, 68719476736ll, size_t(2));298  ASSERT_STREQ_LEN(written, buff, " 0127 68719476736 +002  ");299}300 301TEST(LlvmLibcSPrintfTest, HexConv) {302  char buff[64];303  int written;304 305  // Basic Tests.306 307  written = LIBC_NAMESPACE::sprintf(buff, "%x", 0x123a);308  ASSERT_STREQ_LEN(written, buff, "123a");309 310  written = LIBC_NAMESPACE::sprintf(buff, "%X", 0x456b);311  ASSERT_STREQ_LEN(written, buff, "456B");312 313  // Length Modifier Tests.314 315  written = LIBC_NAMESPACE::sprintf(buff, "%hhx", 0x10001);316  ASSERT_STREQ_LEN(written, buff, "1");317 318  written = LIBC_NAMESPACE::sprintf(buff, "%llx", 0xffffffffffffffffull);319  ASSERT_STREQ_LEN(written, buff, "ffffffffffffffff"); // ull max320 321  written = LIBC_NAMESPACE::sprintf(buff, "%tX", ~ptrdiff_t(0));322  if (sizeof(ptrdiff_t) == 8) {323    ASSERT_STREQ_LEN(written, buff, "FFFFFFFFFFFFFFFF");324  } else if (sizeof(ptrdiff_t) == 4) {325    ASSERT_STREQ_LEN(written, buff, "FFFFFFFF");326  }327 328  // Min Width Tests.329 330  written = LIBC_NAMESPACE::sprintf(buff, "%4x", 0x789);331  ASSERT_STREQ_LEN(written, buff, " 789");332 333  written = LIBC_NAMESPACE::sprintf(buff, "%2X", 0x987);334  ASSERT_STREQ_LEN(written, buff, "987");335 336  // Precision Tests.337 338  written = LIBC_NAMESPACE::sprintf(buff, "%x", 0);339  ASSERT_STREQ_LEN(written, buff, "0");340 341  written = LIBC_NAMESPACE::sprintf(buff, "%.0x", 0);342  ASSERT_STREQ_LEN(written, buff, "");343 344  written = LIBC_NAMESPACE::sprintf(buff, "%.5x", 0x1F3);345  ASSERT_STREQ_LEN(written, buff, "001f3");346 347  written = LIBC_NAMESPACE::sprintf(buff, "%.2x", 0x135);348  ASSERT_STREQ_LEN(written, buff, "135");349 350  // Flag Tests.351 352  written = LIBC_NAMESPACE::sprintf(buff, "%-5x", 0x246);353  ASSERT_STREQ_LEN(written, buff, "246  ");354 355  written = LIBC_NAMESPACE::sprintf(buff, "%#x", 0xd3f);356  ASSERT_STREQ_LEN(written, buff, "0xd3f");357 358  written = LIBC_NAMESPACE::sprintf(buff, "%#x", 0);359  ASSERT_STREQ_LEN(written, buff, "0");360 361  written = LIBC_NAMESPACE::sprintf(buff, "%#X", 0xE40);362  ASSERT_STREQ_LEN(written, buff, "0XE40");363 364  written = LIBC_NAMESPACE::sprintf(buff, "%05x", 0x470);365  ASSERT_STREQ_LEN(written, buff, "00470");366 367  written = LIBC_NAMESPACE::sprintf(buff, "%0#6x", 0x8c3);368  ASSERT_STREQ_LEN(written, buff, "0x08c3");369 370  written = LIBC_NAMESPACE::sprintf(buff, "%-#6x", 0x5f0);371  ASSERT_STREQ_LEN(written, buff, "0x5f0 ");372 373  // Combined Tests.374 375  written = LIBC_NAMESPACE::sprintf(buff, "%#-07x", 0x703);376  ASSERT_STREQ_LEN(written, buff, "0x703  ");377 378  written = LIBC_NAMESPACE::sprintf(buff, "%7.5x", 0x814);379  ASSERT_STREQ_LEN(written, buff, "  00814");380 381  written = LIBC_NAMESPACE::sprintf(buff, "%#9.5X", 0x9d4);382  ASSERT_STREQ_LEN(written, buff, "  0X009D4");383 384  written = LIBC_NAMESPACE::sprintf(buff, "%#.x", 0);385  ASSERT_STREQ_LEN(written, buff, "");386 387  written = LIBC_NAMESPACE::sprintf(buff, "%-7.5x", 0x260);388  ASSERT_STREQ_LEN(written, buff, "00260  ");389 390  written = LIBC_NAMESPACE::sprintf(buff, "%5.4x", 0x10000);391  ASSERT_STREQ_LEN(written, buff, "10000");392 393  // Multiple Conversion Tests.394 395  written = LIBC_NAMESPACE::sprintf(buff, "%10X %-#10x", 0x45b, 0x789);396  ASSERT_STREQ_LEN(written, buff, "       45B 0x789     ");397 398  written = LIBC_NAMESPACE::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25);399  ASSERT_STREQ_LEN(written, buff, "0075 0x0025");400 401  written = LIBC_NAMESPACE::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f,402                                    0x1000000000ll, size_t(2));403  ASSERT_STREQ_LEN(written, buff, "007F 0x1000000000 002   ");404}405 406TEST(LlvmLibcSPrintfTest, BinConv) {407  char buff[64];408  int written;409 410  // Basic Tests.411 412  written = LIBC_NAMESPACE::sprintf(buff, "%b", 42);413  ASSERT_STREQ_LEN(written, buff, "101010");414 415  written = LIBC_NAMESPACE::sprintf(buff, "%B", 12081991);416  ASSERT_STREQ_LEN(written, buff, "101110000101101101000111");417 418  // Min Width Tests.419 420  written = LIBC_NAMESPACE::sprintf(buff, "%10b", 0b101010);421  ASSERT_STREQ_LEN(written, buff, "    101010");422 423  written = LIBC_NAMESPACE::sprintf(buff, "%2B", 0b101010);424  ASSERT_STREQ_LEN(written, buff, "101010");425 426  // Precision Tests.427 428  written = LIBC_NAMESPACE::sprintf(buff, "%b", 0);429  ASSERT_STREQ_LEN(written, buff, "0");430 431  written = LIBC_NAMESPACE::sprintf(buff, "%.0b", 0);432  ASSERT_STREQ_LEN(written, buff, "");433 434  written = LIBC_NAMESPACE::sprintf(buff, "%.5b", 0b111);435  ASSERT_STREQ_LEN(written, buff, "00111");436 437  written = LIBC_NAMESPACE::sprintf(buff, "%.2b", 0b111);438  ASSERT_STREQ_LEN(written, buff, "111");439 440  written = LIBC_NAMESPACE::sprintf(buff, "%3b", 0b111);441  ASSERT_STREQ_LEN(written, buff, "111");442 443  // Flag Tests.444 445  written = LIBC_NAMESPACE::sprintf(buff, "%-5b", 0b111);446  ASSERT_STREQ_LEN(written, buff, "111  ");447 448  written = LIBC_NAMESPACE::sprintf(buff, "%#b", 0b111);449  ASSERT_STREQ_LEN(written, buff, "0b111");450 451  written = LIBC_NAMESPACE::sprintf(buff, "%#b", 0);452  ASSERT_STREQ_LEN(written, buff, "0");453 454  written = LIBC_NAMESPACE::sprintf(buff, "%#B", 0b111);455  ASSERT_STREQ_LEN(written, buff, "0B111");456 457  written = LIBC_NAMESPACE::sprintf(buff, "%05b", 0b111);458  ASSERT_STREQ_LEN(written, buff, "00111");459 460  written = LIBC_NAMESPACE::sprintf(buff, "%0#6b", 0b111);461  ASSERT_STREQ_LEN(written, buff, "0b0111");462 463  written = LIBC_NAMESPACE::sprintf(buff, "%-#6b", 0b111);464  ASSERT_STREQ_LEN(written, buff, "0b111 ");465 466  // Combined Tests.467 468  written = LIBC_NAMESPACE::sprintf(buff, "%#-07b", 0b111);469  ASSERT_STREQ_LEN(written, buff, "0b111  ");470 471  written = LIBC_NAMESPACE::sprintf(buff, "%7.5b", 0b111);472  ASSERT_STREQ_LEN(written, buff, "  00111");473 474  written = LIBC_NAMESPACE::sprintf(buff, "%#9.5B", 0b111);475  ASSERT_STREQ_LEN(written, buff, "  0B00111");476 477  written = LIBC_NAMESPACE::sprintf(buff, "%#.b", 0);478  ASSERT_STREQ_LEN(written, buff, "");479 480  written = LIBC_NAMESPACE::sprintf(buff, "%-7.5b", 0b111);481  ASSERT_STREQ_LEN(written, buff, "00111  ");482 483  written = LIBC_NAMESPACE::sprintf(buff, "%5.4b", 0b1111);484  ASSERT_STREQ_LEN(written, buff, " 1111");485 486  // Multiple Conversion Tests.487 488  written = LIBC_NAMESPACE::sprintf(buff, "%10B %-#10b", 0b101, 0b110);489  ASSERT_STREQ_LEN(written, buff, "       101 0b110     ");490 491  written = LIBC_NAMESPACE::sprintf(buff, "%-5.4b%#.4b", 0b101, 0b110);492  ASSERT_STREQ_LEN(written, buff, "0101 0b0110");493}494 495TEST(LlvmLibcSPrintfTest, PointerConv) {496  char buff[64];497  int written;498 499  written = LIBC_NAMESPACE::sprintf(buff, "%p", nullptr);500  ASSERT_STREQ_LEN(written, buff, "(nullptr)");501 502  written = LIBC_NAMESPACE::sprintf(buff, "%p", 0x1a2b3c4d);503  ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d");504 505  if constexpr (sizeof(void *) > 4) {506    written = LIBC_NAMESPACE::sprintf(buff, "%p", 0x1a2b3c4d5e6f7081);507    ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d5e6f7081");508  }509 510  written = LIBC_NAMESPACE::sprintf(buff, "%p", &written);511  EXPECT_GT(written, 0);512 513  // Width tests:514 515  written = LIBC_NAMESPACE::sprintf(buff, "%20p", nullptr);516  ASSERT_STREQ_LEN(written, buff, "           (nullptr)");517 518  written = LIBC_NAMESPACE::sprintf(buff, "%20p", 0x1a2b3c4d);519  ASSERT_STREQ_LEN(written, buff, "          0x1a2b3c4d");520 521  // Flag tests:522 523  written = LIBC_NAMESPACE::sprintf(buff, "%-20p", nullptr);524  ASSERT_STREQ_LEN(written, buff, "(nullptr)           ");525 526  written = LIBC_NAMESPACE::sprintf(buff, "%-20p", 0x1a2b3c4d);527  ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d          ");528 529  // Using the 0 flag is technically undefined, but here we're following the530  // convention of matching the behavior of %#x.531  written = LIBC_NAMESPACE::sprintf(buff, "%020p", 0x1a2b3c4d);532  ASSERT_STREQ_LEN(written, buff, "0x00000000001a2b3c4d");533 534  // Precision tests:535  // These are all undefined behavior. The precision option is undefined for %p.536 537  // Precision specifies the number of characters for a string conversion.538  written = LIBC_NAMESPACE::sprintf(buff, "%.5p", nullptr);539  ASSERT_STREQ_LEN(written, buff, "(null");540 541  // Precision specifies the number of digits to be written for %x conversions,542  // and the "0x" doesn't count as part of the digits.543  written = LIBC_NAMESPACE::sprintf(buff, "%.20p", 0x1a2b3c4d);544  ASSERT_STREQ_LEN(written, buff, "0x0000000000001a2b3c4d");545}546 547TEST(LlvmLibcSPrintfTest, OctConv) {548  char buff[64];549  int written;550 551  // Basic Tests.552 553  written = LIBC_NAMESPACE::sprintf(buff, "%o", 01234);554  ASSERT_STREQ_LEN(written, buff, "1234");555 556  written = LIBC_NAMESPACE::sprintf(buff, "%o", 04567);557  ASSERT_STREQ_LEN(written, buff, "4567");558 559  // Length Modifier Tests.560 561  written = LIBC_NAMESPACE::sprintf(buff, "%hho", 0401);562  ASSERT_STREQ_LEN(written, buff, "1");563 564  written = LIBC_NAMESPACE::sprintf(buff, "%llo", 01777777777777777777777ull);565  ASSERT_STREQ_LEN(written, buff, "1777777777777777777777"); // ull max566 567  written = LIBC_NAMESPACE::sprintf(buff, "%to", ~ptrdiff_t(0));568  if (sizeof(ptrdiff_t) == 8) {569    ASSERT_STREQ_LEN(written, buff, "1777777777777777777777");570  } else if (sizeof(ptrdiff_t) == 4) {571    ASSERT_STREQ_LEN(written, buff, "37777777777");572  }573 574  // Min Width Tests.575 576  written = LIBC_NAMESPACE::sprintf(buff, "%4o", 0701);577  ASSERT_STREQ_LEN(written, buff, " 701");578 579  written = LIBC_NAMESPACE::sprintf(buff, "%2o", 0107);580  ASSERT_STREQ_LEN(written, buff, "107");581 582  // Precision Tests.583 584  written = LIBC_NAMESPACE::sprintf(buff, "%o", 0);585  ASSERT_STREQ_LEN(written, buff, "0");586 587  written = LIBC_NAMESPACE::sprintf(buff, "%.0o", 0);588  ASSERT_STREQ_LEN(written, buff, "");589 590  written = LIBC_NAMESPACE::sprintf(buff, "%.5o", 0153);591  ASSERT_STREQ_LEN(written, buff, "00153");592 593  written = LIBC_NAMESPACE::sprintf(buff, "%.2o", 0135);594  ASSERT_STREQ_LEN(written, buff, "135");595 596  // Flag Tests.597 598  written = LIBC_NAMESPACE::sprintf(buff, "%-5o", 0246);599  ASSERT_STREQ_LEN(written, buff, "246  ");600 601  written = LIBC_NAMESPACE::sprintf(buff, "%#o", 0234);602  ASSERT_STREQ_LEN(written, buff, "0234");603 604  written = LIBC_NAMESPACE::sprintf(buff, "%#o", 0);605  ASSERT_STREQ_LEN(written, buff, "0");606 607  written = LIBC_NAMESPACE::sprintf(buff, "%05o", 0470);608  ASSERT_STREQ_LEN(written, buff, "00470");609 610  written = LIBC_NAMESPACE::sprintf(buff, "%0#6o", 0753);611  ASSERT_STREQ_LEN(written, buff, "000753");612 613  written = LIBC_NAMESPACE::sprintf(buff, "%-#6o", 0642);614  ASSERT_STREQ_LEN(written, buff, "0642  ");615 616  // Combined Tests.617 618  written = LIBC_NAMESPACE::sprintf(buff, "%#-07o", 0703);619  ASSERT_STREQ_LEN(written, buff, "0703   ");620 621  written = LIBC_NAMESPACE::sprintf(buff, "%#.o", 0);622  ASSERT_STREQ_LEN(written, buff, "0");623 624  written = LIBC_NAMESPACE::sprintf(buff, "%7.5o", 0314);625  ASSERT_STREQ_LEN(written, buff, "  00314");626 627  written = LIBC_NAMESPACE::sprintf(buff, "%#9.5o", 0234);628  ASSERT_STREQ_LEN(written, buff, "    00234");629 630  written = LIBC_NAMESPACE::sprintf(buff, "%-7.5o", 0260);631  ASSERT_STREQ_LEN(written, buff, "00260  ");632 633  written = LIBC_NAMESPACE::sprintf(buff, "%5.4o", 010000);634  ASSERT_STREQ_LEN(written, buff, "10000");635 636  // Multiple Conversion Tests.637 638  written = LIBC_NAMESPACE::sprintf(buff, "%10o %-#10o", 0456, 0123);639  ASSERT_STREQ_LEN(written, buff, "       456 0123      ");640 641  written = LIBC_NAMESPACE::sprintf(buff, "%-5.4o%#.4o", 075, 025);642  ASSERT_STREQ_LEN(written, buff, "0075 0025");643 644  written = LIBC_NAMESPACE::sprintf(buff, "%04hho %#.5llo %-6.3zo", 256 + 077,645                                    01000000000000ll, size_t(2));646  ASSERT_STREQ_LEN(written, buff, "0077 01000000000000 002   ");647}648 649#ifndef LIBC_COPT_PRINTF_DISABLE_FLOAT650 651TEST(LlvmLibcSPrintfTest, FloatHexExpConv) {652  char buff[128];653  int written;654 655  ForceRoundingMode r(RoundingMode::Nearest);656  double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();657  double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();658  written = LIBC_NAMESPACE::sprintf(buff, "%a", 1.0);659  ASSERT_STREQ_LEN(written, buff, "0x1p+0");660 661  written = LIBC_NAMESPACE::sprintf(buff, "%A", -1.0);662  ASSERT_STREQ_LEN(written, buff, "-0X1P+0");663 664  written = LIBC_NAMESPACE::sprintf(buff, "%a", -0x1.abcdef12345p0);665  ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0");666 667  written = LIBC_NAMESPACE::sprintf(buff, "%A", 0x1.abcdef12345p0);668  ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0");669 670  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0.0);671  ASSERT_STREQ_LEN(written, buff, "0x0p+0");672 673  written = LIBC_NAMESPACE::sprintf(buff, "%a", 1.0e100);674  ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332");675 676  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0.1);677  ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");678 679  // Subnormal Tests.680 681  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1027);682  ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022");683 684  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1025);685  ASSERT_STREQ_LEN(written, buff, "0x0.2p-1022");686 687  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1023);688  ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022");689 690  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1022);691  ASSERT_STREQ_LEN(written, buff, "0x1p-1022");692 693  written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1074);694  ASSERT_STREQ_LEN(written, buff, "0x0.0000000000001p-1022");695 696  // Inf/Nan Tests.697 698  written = LIBC_NAMESPACE::sprintf(buff, "%a", inf);699  ASSERT_STREQ_LEN(written, buff, "inf");700 701  written = LIBC_NAMESPACE::sprintf(buff, "%A", -inf);702  ASSERT_STREQ_LEN(written, buff, "-INF");703 704  written = LIBC_NAMESPACE::sprintf(buff, "%a", nan);705  ASSERT_STREQ_LEN(written, buff, "nan");706 707  written = LIBC_NAMESPACE::sprintf(buff, "%A", -nan);708  ASSERT_STREQ_LEN(written, buff, "-NAN");709 710  // Length Modifier Tests.711 712  written = LIBC_NAMESPACE::sprintf(buff, "%La", 0.1L);713#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)714  ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7");715#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)716  ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");717#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)718  ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4");719#endif720 721  written = LIBC_NAMESPACE::sprintf(buff, "%La", 1.0e1000L);722#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)723  ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318");724#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)725  ASSERT_STREQ_LEN(written, buff, "inf");726#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)727  ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321");728#endif729 730  written = LIBC_NAMESPACE::sprintf(buff, "%La", 1.0e-1000L);731#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)732  ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325");733#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)734  ASSERT_STREQ_LEN(written, buff, "0x0p+0");735#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)736  ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322");737#endif738 739  // Min Width Tests.740 741  written = LIBC_NAMESPACE::sprintf(buff, "%15a", 1.0);742  ASSERT_STREQ_LEN(written, buff, "         0x1p+0");743 744  written = LIBC_NAMESPACE::sprintf(buff, "%15a", -1.0);745  ASSERT_STREQ_LEN(written, buff, "        -0x1p+0");746 747  written = LIBC_NAMESPACE::sprintf(buff, "%15a", 1.0e10);748  ASSERT_STREQ_LEN(written, buff, " 0x1.2a05f2p+33");749 750  written = LIBC_NAMESPACE::sprintf(buff, "%15a", -1.0e10);751  ASSERT_STREQ_LEN(written, buff, "-0x1.2a05f2p+33");752 753  written = LIBC_NAMESPACE::sprintf(buff, "%10a", 1.0e10);754  ASSERT_STREQ_LEN(written, buff, "0x1.2a05f2p+33");755 756  written = LIBC_NAMESPACE::sprintf(buff, "%5a", inf);757  ASSERT_STREQ_LEN(written, buff, "  inf");758 759  written = LIBC_NAMESPACE::sprintf(buff, "%5a", -nan);760  ASSERT_STREQ_LEN(written, buff, " -nan");761 762  // Precision Tests.763 764  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 1.0);765  ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");766 767  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0.0);768  ASSERT_STREQ_LEN(written, buff, "0x0.0p+0");769 770  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0.1);771  ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");772 773  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0fp0);774  ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");775 776  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.07p0);777  ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");778 779  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);780  ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");781 782  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);783  ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");784 785  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.ffp0);786  ASSERT_STREQ_LEN(written, buff, "0x2.0p+0");787 788  written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 1.25);789  ASSERT_STREQ_LEN(written, buff, "0x1.40000p+0");790 791  written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 1.25);792  ASSERT_STREQ_LEN(written, buff, "0x1p+0");793 794  written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 1.75);795  ASSERT_STREQ_LEN(written, buff, "0x2p+0");796 797  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1023);798  ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022");799 800  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.8p-1023);801  ASSERT_STREQ_LEN(written, buff, "0x0.cp-1022");802 803  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1024);804  ASSERT_STREQ_LEN(written, buff, "0x0.4p-1022");805 806  written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.0p-1023);807  ASSERT_STREQ_LEN(written, buff, "0x0p-1022");808 809  written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.8p-1023);810  ASSERT_STREQ_LEN(written, buff, "0x1p-1022");811 812  written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.0p-1024);813  ASSERT_STREQ_LEN(written, buff, "0x0p-1022");814 815  written = LIBC_NAMESPACE::sprintf(buff, "%.2a", 0x1.0p-1027);816  ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022");817 818  written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1027);819  ASSERT_STREQ_LEN(written, buff, "0x0.0p-1022");820 821  written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0.0);822  ASSERT_STREQ_LEN(written, buff, "0x0.00000p+0");823 824  written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0x1.008p0);825  ASSERT_STREQ_LEN(written, buff, "0x1.00800p+0");826 827  written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0x1.008p10);828  ASSERT_STREQ_LEN(written, buff, "0x1.00800p+10");829 830  written = LIBC_NAMESPACE::sprintf(buff, "%.5a", nan);831  ASSERT_STREQ_LEN(written, buff, "nan");832 833  written = LIBC_NAMESPACE::sprintf(buff, "%La", 0.0L);834  ASSERT_STREQ_LEN(written, buff, "0x0p+0");835 836  written = LIBC_NAMESPACE::sprintf(buff, "%.1La", 0.1L);837#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)838  ASSERT_STREQ_LEN(written, buff, "0xc.dp-7");839#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)840  ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");841#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)842  ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");843#endif844 845  written = LIBC_NAMESPACE::sprintf(buff, "%.1La", 0xf.fffffffffffffffp16380L);846#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)847  ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384");848#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)849  ASSERT_STREQ_LEN(written, buff, "inf");850#elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)851  ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383");852#endif853 854  // Rounding Mode Tests.855 856  if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {857    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);858    ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");859 860    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);861    ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");862 863    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);864    ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");865 866    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);867    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");868 869    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);870    ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");871 872    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);873    ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");874 875    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);876    ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");877 878    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);879    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");880  }881 882  if (ForceRoundingMode r(RoundingMode::Upward); r.success) {883    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);884    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");885 886    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);887    ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");888 889    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);890    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");891 892    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);893    ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");894 895    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);896    ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");897 898    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);899    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");900 901    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);902    ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");903 904    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);905    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");906  }907 908  if (ForceRoundingMode r(RoundingMode::Downward); r.success) {909    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);910    ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");911 912    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);913    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");914 915    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);916    ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");917 918    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);919    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");920 921    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);922    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");923 924    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);925    ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");926 927    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);928    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");929 930    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);931    ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");932  }933 934  if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {935    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);936    ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");937 938    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);939    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");940 941    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);942    ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");943 944    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);945    ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");946 947    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);948    ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");949 950    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);951    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");952 953    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);954    ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");955 956    written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);957    ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");958  }959 960  // Flag Tests.961 962  written = LIBC_NAMESPACE::sprintf(buff, "%+a", nan);963  ASSERT_STREQ_LEN(written, buff, "+nan");964 965  written = LIBC_NAMESPACE::sprintf(buff, "% A", inf);966  ASSERT_STREQ_LEN(written, buff, " INF");967 968  written = LIBC_NAMESPACE::sprintf(buff, "%-5a", inf);969  ASSERT_STREQ_LEN(written, buff, "inf  ");970 971  written = LIBC_NAMESPACE::sprintf(buff, "%+-5A", nan);972  ASSERT_STREQ_LEN(written, buff, "+NAN ");973 974  written = LIBC_NAMESPACE::sprintf(buff, "%+a", 1.0);975  ASSERT_STREQ_LEN(written, buff, "+0x1p+0");976 977  written = LIBC_NAMESPACE::sprintf(buff, "% a", 0.0);978  ASSERT_STREQ_LEN(written, buff, " 0x0p+0");979 980  written = LIBC_NAMESPACE::sprintf(buff, "%-10a", 1.5);981  ASSERT_STREQ_LEN(written, buff, "0x1.8p+0  ");982 983  written = LIBC_NAMESPACE::sprintf(buff, "%#a", 1.0);984  ASSERT_STREQ_LEN(written, buff, "0x1.p+0");985 986  written = LIBC_NAMESPACE::sprintf(buff, "%#.0a", 1.5);987  ASSERT_STREQ_LEN(written, buff, "0x2.p+0");988 989  written = LIBC_NAMESPACE::sprintf(buff, "%010a", 1.5);990  ASSERT_STREQ_LEN(written, buff, "0x001.8p+0");991 992  written = LIBC_NAMESPACE::sprintf(buff, "%+- #0a", 0.0);993  ASSERT_STREQ_LEN(written, buff, "+0x0.p+0");994 995  // Combined Tests.996 997  written = LIBC_NAMESPACE::sprintf(buff, "%12.3a %-12.3A", 0.1, 256.0);998  ASSERT_STREQ_LEN(written, buff, "  0x1.99ap-4 0X1.000P+8  ");999 1000  written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3a % 012.3a", 0.1256, 1256.0);1001  ASSERT_STREQ_LEN(written, buff, "+0x1.014p-3   0x1.3a0p+10");1002 1003  // These tests check that the padding is properly calculated based on the1004  // min_width field. Specifically, they check that the extra zeroes added by1005  // the high precision are accounted for correctly.1006  written = LIBC_NAMESPACE::sprintf(buff, "%50.50a", 0x1.0p0);1007  ASSERT_STREQ_LEN(written, buff,1008                   "0x1.00000000000000000000000000000000000000000000000000p+0");1009 1010  // The difference with this test is that the formatted number is exactly 571011  // characters, so padding to 58 adds a space.1012  written = LIBC_NAMESPACE::sprintf(buff, "%58.50a", 0x1.0p0);1013  ASSERT_STREQ_LEN(1014      written, buff,1015      " 0x1.00000000000000000000000000000000000000000000000000p+0");1016}1017 1018TEST(LlvmLibcSPrintfTest, FloatDecimalConv) {1019  char buff[1500];1020  int written;1021 1022  ForceRoundingMode r(RoundingMode::Nearest);1023  double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();1024  double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();1025  long double ld_inf =1026      LIBC_NAMESPACE::fputil::FPBits<long double>::inf().get_val();1027  long double ld_nan =1028      LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val();1029 1030  written = LIBC_NAMESPACE::sprintf(buff, "%f", 1.0);1031  ASSERT_STREQ_LEN(written, buff, "1.000000");1032 1033  written = LIBC_NAMESPACE::sprintf(buff, "%F", -1.0);1034  ASSERT_STREQ_LEN(written, buff, "-1.000000");1035 1036  written = LIBC_NAMESPACE::sprintf(buff, "%f", -1.234567);1037  ASSERT_STREQ_LEN(written, buff, "-1.234567");1038 1039  written = LIBC_NAMESPACE::sprintf(buff, "%f", 0.0);1040  ASSERT_STREQ_LEN(written, buff, "0.000000");1041 1042  written = LIBC_NAMESPACE::sprintf(buff, "%f", 1.5);1043  ASSERT_STREQ_LEN(written, buff, "1.500000");1044 1045#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1046  written = LIBC_NAMESPACE::sprintf(buff, "%f", 1e300);1047  ASSERT_STREQ_LEN(1048      written, buff,1049      "100000000000000005250476025520442024870446858110815915491585411551180245"1050      "798890819578637137508044786404370444383288387817694252323536043057564479"1051      "218478670698284838720092657580373783023379478809005936895323497079994508"1052      "111903896764088007465274278014249457925878882005684283811566947219638686"1053      "5459400540160.000000");1054#endif // LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1055 1056  written = LIBC_NAMESPACE::sprintf(buff, "%f", 0.1);1057  ASSERT_STREQ_LEN(written, buff, "0.100000");1058 1059  written = LIBC_NAMESPACE::sprintf(buff, "%f", 1234567890123456789.0);1060  ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000");1061 1062  written = LIBC_NAMESPACE::sprintf(buff, "%f", 9999999999999.99);1063  ASSERT_STREQ_LEN(written, buff, "9999999999999.990234");1064 1065  // Simple Subnormal Tests.1066 1067  written = LIBC_NAMESPACE::sprintf(buff, "%f", 0x1.0p-1027);1068  ASSERT_STREQ_LEN(written, buff, "0.000000");1069 1070  written = LIBC_NAMESPACE::sprintf(buff, "%f", 0x1.0p-1074);1071  ASSERT_STREQ_LEN(written, buff, "0.000000");1072 1073  // Inf/Nan Tests.1074 1075  written = LIBC_NAMESPACE::sprintf(buff, "%f", inf);1076  ASSERT_STREQ_LEN(written, buff, "inf");1077 1078  written = LIBC_NAMESPACE::sprintf(buff, "%F", -inf);1079  ASSERT_STREQ_LEN(written, buff, "-INF");1080 1081  written = LIBC_NAMESPACE::sprintf(buff, "%f", nan);1082  ASSERT_STREQ_LEN(written, buff, "nan");1083 1084  written = LIBC_NAMESPACE::sprintf(buff, "%F", -nan);1085  ASSERT_STREQ_LEN(written, buff, "-NAN");1086 1087  written = LIBC_NAMESPACE::sprintf(buff, "%Lf", ld_inf);1088  ASSERT_STREQ_LEN(written, buff, "inf");1089 1090  written = LIBC_NAMESPACE::sprintf(buff, "%LF", -ld_inf);1091  ASSERT_STREQ_LEN(written, buff, "-INF");1092 1093  written = LIBC_NAMESPACE::sprintf(buff, "%Lf", ld_nan);1094  ASSERT_STREQ_LEN(written, buff, "nan");1095 1096// Some float128 systems (specifically the ones used for aarch64 buildbots)1097// don't respect signs for long double NaNs.1098#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) ||                          \1099    defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)1100  written = LIBC_NAMESPACE::sprintf(buff, "%LF", -ld_nan);1101  ASSERT_STREQ_LEN(written, buff, "-NAN");1102#endif1103 1104  // Min Width Tests.1105 1106  written = LIBC_NAMESPACE::sprintf(buff, "%15f", 1.0);1107  ASSERT_STREQ_LEN(written, buff, "       1.000000");1108 1109  written = LIBC_NAMESPACE::sprintf(buff, "%15f", -1.0);1110  ASSERT_STREQ_LEN(written, buff, "      -1.000000");1111 1112  written = LIBC_NAMESPACE::sprintf(buff, "%15f", 1.0e5);1113  ASSERT_STREQ_LEN(written, buff, "  100000.000000");1114 1115  written = LIBC_NAMESPACE::sprintf(buff, "%15f", -1.0e5);1116  ASSERT_STREQ_LEN(written, buff, " -100000.000000");1117 1118  written = LIBC_NAMESPACE::sprintf(buff, "%10f", 1.0e5);1119  ASSERT_STREQ_LEN(written, buff, "100000.000000");1120 1121  // Precision Tests.1122 1123  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.0);1124  ASSERT_STREQ_LEN(written, buff, "1.0");1125 1126  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0.0);1127  ASSERT_STREQ_LEN(written, buff, "0.0");1128 1129  written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 0.0);1130  ASSERT_STREQ_LEN(written, buff, "0");1131 1132  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0.1);1133  ASSERT_STREQ_LEN(written, buff, "0.1");1134 1135  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.09);1136  ASSERT_STREQ_LEN(written, buff, "1.1");1137 1138  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.04);1139  ASSERT_STREQ_LEN(written, buff, "1.0");1140 1141  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.19);1142  ASSERT_STREQ_LEN(written, buff, "1.2");1143 1144  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.99);1145  ASSERT_STREQ_LEN(written, buff, "2.0");1146 1147  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 9.99);1148  ASSERT_STREQ_LEN(written, buff, "10.0");1149 1150  written = LIBC_NAMESPACE::sprintf(buff, "%.2f", 9999999999999.99);1151  ASSERT_STREQ_LEN(written, buff, "9999999999999.99");1152 1153  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 9999999999999.99);1154  ASSERT_STREQ_LEN(written, buff, "10000000000000.0");1155 1156  written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.25);1157  ASSERT_STREQ_LEN(written, buff, "1.25000");1158 1159  written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 1.25);1160  ASSERT_STREQ_LEN(written, buff, "1");1161 1162  written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 1.75);1163  ASSERT_STREQ_LEN(written, buff, "2");1164 1165  written = LIBC_NAMESPACE::sprintf(buff, "%.20f", 1.234e-10);1166  ASSERT_STREQ_LEN(written, buff, "0.00000000012340000000");1167 1168  written = LIBC_NAMESPACE::sprintf(buff, "%.2f", -9.99);1169  ASSERT_STREQ_LEN(written, buff, "-9.99");1170 1171  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -9.99);1172  ASSERT_STREQ_LEN(written, buff, "-10.0");1173 1174  written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 0.0);1175  ASSERT_STREQ_LEN(written, buff, "0.00000");1176 1177  written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.008);1178  ASSERT_STREQ_LEN(written, buff, "1.00800");1179 1180  written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.008e3);1181  ASSERT_STREQ_LEN(written, buff, "1008.00000");1182 1183  // Found with the help of Fred Tydeman's tbin2dec test.1184  written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0x1.1000000000006p+3);1185  ASSERT_STREQ_LEN(written, buff, "8.5");1186 1187  written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 0x1.1000000000006p+3);1188  ASSERT_STREQ_LEN(written, buff, "9");1189 1190  // Most of these tests are checking rounding behavior when the precision is1191  // set. As an example, %.9f has a precision of 9, meaning it should be rounded1192  // to 9 digits after the decimal point. In this case, that means that it1193  // should be rounded up. Many of these tests have precisions divisible by 91194  // since when printing the floating point numbers are broken up into "blocks"1195  // of 9 digits. They often also have a 5 after the end of what's printed,1196  // since in round to nearest mode, that requires checking additional digits.1197  written = LIBC_NAMESPACE::sprintf(buff, "%.9f", 1.9999999999999514);1198  ASSERT_STREQ_LEN(written, buff, "2.000000000");1199 1200#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1201  // The number continues after the literal because floating point numbers can't1202  // represent every value. The printed value is the closest value a double can1203  // represent, rounded to the requested precision.1204  written = LIBC_NAMESPACE::sprintf(buff, "%.238f", 1.131959884853339E-72);1205  ASSERT_STREQ_LEN(1206      written, buff,1207      "0."1208      "000000000000000000000000000000000000000000000000000000000000000000000001"1209      "131959884853339045938639911360973972585316399767392273697826861241937664"1210      "824105639342441431495119762431744054912109728706985341609159156917030486"1211      "5110665559768676757812");1212#endif1213 1214  written = LIBC_NAMESPACE::sprintf(buff, "%.36f", 9.9e-77);1215  ASSERT_STREQ_LEN(written, buff, "0.000000000000000000000000000000000000");1216 1217#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1218  written = LIBC_NAMESPACE::sprintf(buff, "%.1071f", 2.0226568751604562E-314);1219  ASSERT_STREQ_LEN(1220      written, buff,1221      "0."1222      "000000000000000000000000000000000000000000000000000000000000000000000000"1223      "000000000000000000000000000000000000000000000000000000000000000000000000"1224      "000000000000000000000000000000000000000000000000000000000000000000000000"1225      "000000000000000000000000000000000000000000000000000000000000000000000000"1226      "000000000000000000000000020226568751604561683387695750739190248658016786"1227      "876938365740768295004457513021760887468117675879956193821375945376632621"1228      "367998639317487303530427946024002091961988296562516210434394107910027236"1229      "308233439098296717697919471698168200340836487924061502604112643734560622"1230      "258525943451473162532620033398739382796482175564084902819878893430369431"1231      "907237673154867595954110791891883281880339550955455702452422857027182100"1232      "606009588295886640782228837851739241290179512817803196347460636150182981"1233      "085084829941917048152725177119574542042352896161225179181967347829576272"1234      "242480201291872969114441104973910102402751449901108484914924879541248714"1235      "939096548775588293353689592872854495101242645279589976452453829724479805"1236      "750016448075109469332839157162950982637994457036256790161132812");1237#endif1238 1239  // If no precision is specified it defaults to 6 for %f.1240  written = LIBC_NAMESPACE::sprintf(buff, "%f", 2325885.4901960781);1241  ASSERT_STREQ_LEN(written, buff, "2325885.490196");1242 1243  // Subnormal Precision Tests1244 1245  written = LIBC_NAMESPACE::sprintf(buff, "%.310f", 0x1.0p-1022);1246  ASSERT_STREQ_LEN(1247      written, buff,1248      "0."1249      "000000000000000000000000000000000000000000000000000000000000000000000000"1250      "000000000000000000000000000000000000000000000000000000000000000000000000"1251      "000000000000000000000000000000000000000000000000000000000000000000000000"1252      "000000000000000000000000000000000000000000000000000000000000000000000000"1253      "0000000000000000000223");1254 1255  written = LIBC_NAMESPACE::sprintf(buff, "%.310f", 0x1.0p-1023);1256  ASSERT_STREQ_LEN(1257      written, buff,1258      "0."1259      "000000000000000000000000000000000000000000000000000000000000000000000000"1260      "000000000000000000000000000000000000000000000000000000000000000000000000"1261      "000000000000000000000000000000000000000000000000000000000000000000000000"1262      "000000000000000000000000000000000000000000000000000000000000000000000000"1263      "0000000000000000000111");1264 1265  written = LIBC_NAMESPACE::sprintf(buff, "%.315f", 9.99999e-310);1266  ASSERT_STREQ_LEN(1267      written, buff,1268      "0."1269      "000000000000000000000000000000000000000000000000000000000000000000000000"1270      "000000000000000000000000000000000000000000000000000000000000000000000000"1271      "000000000000000000000000000000000000000000000000000000000000000000000000"1272      "000000000000000000000000000000000000000000000000000000000000000000000000"1273      "000000000000000000000999999");1274 1275  written = LIBC_NAMESPACE::sprintf(buff, "%.314f", 9.99999e-310);1276  ASSERT_STREQ_LEN(1277      written, buff,1278      "0."1279      "000000000000000000000000000000000000000000000000000000000000000000000000"1280      "000000000000000000000000000000000000000000000000000000000000000000000000"1281      "000000000000000000000000000000000000000000000000000000000000000000000000"1282      "000000000000000000000000000000000000000000000000000000000000000000000000"1283      "00000000000000000000100000");1284 1285  written = LIBC_NAMESPACE::sprintf(buff, "%.330f", 0x1.0p-1074);1286  ASSERT_STREQ_LEN(1287      written, buff,1288      "0."1289      "000000000000000000000000000000000000000000000000000000000000000000000000"1290      "000000000000000000000000000000000000000000000000000000000000000000000000"1291      "000000000000000000000000000000000000000000000000000000000000000000000000"1292      "000000000000000000000000000000000000000000000000000000000000000000000000"1293      "000000000000000000000000000000000004940656");1294 1295  // Rounding Mode Tests.1296 1297  if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {1298    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);1299    ASSERT_STREQ_LEN(written, buff, "1.8");1300 1301    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);1302    ASSERT_STREQ_LEN(written, buff, "1.2");1303 1304    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);1305    ASSERT_STREQ_LEN(written, buff, "1.1");1306 1307    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);1308    ASSERT_STREQ_LEN(written, buff, "1.6");1309 1310    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);1311    ASSERT_STREQ_LEN(written, buff, "1.4");1312 1313    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);1314    ASSERT_STREQ_LEN(written, buff, "1.9");1315 1316    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);1317    ASSERT_STREQ_LEN(written, buff, "-1.8");1318 1319    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);1320    ASSERT_STREQ_LEN(written, buff, "-1.2");1321 1322    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);1323    ASSERT_STREQ_LEN(written, buff, "-1.1");1324 1325    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);1326    ASSERT_STREQ_LEN(written, buff, "-1.6");1327 1328    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);1329    ASSERT_STREQ_LEN(written, buff, "-1.4");1330 1331    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);1332    ASSERT_STREQ_LEN(written, buff, "-1.9");1333  }1334 1335  if (ForceRoundingMode r(RoundingMode::Upward); r.success) {1336    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);1337    ASSERT_STREQ_LEN(written, buff, "1.8");1338 1339    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);1340    ASSERT_STREQ_LEN(written, buff, "1.3");1341 1342    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);1343    ASSERT_STREQ_LEN(written, buff, "1.2");1344 1345    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);1346    ASSERT_STREQ_LEN(written, buff, "1.7");1347 1348    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);1349    ASSERT_STREQ_LEN(written, buff, "1.4");1350 1351    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);1352    ASSERT_STREQ_LEN(written, buff, "1.9");1353 1354    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);1355    ASSERT_STREQ_LEN(written, buff, "-1.7");1356 1357    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);1358    ASSERT_STREQ_LEN(written, buff, "-1.2");1359 1360    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);1361    ASSERT_STREQ_LEN(written, buff, "-1.1");1362 1363    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);1364    ASSERT_STREQ_LEN(written, buff, "-1.6");1365 1366    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);1367    ASSERT_STREQ_LEN(written, buff, "-1.3");1368 1369    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);1370    ASSERT_STREQ_LEN(written, buff, "-1.8");1371  }1372 1373  if (ForceRoundingMode r(RoundingMode::Downward); r.success) {1374    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);1375    ASSERT_STREQ_LEN(written, buff, "1.7");1376 1377    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);1378    ASSERT_STREQ_LEN(written, buff, "1.2");1379 1380    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);1381    ASSERT_STREQ_LEN(written, buff, "1.1");1382 1383    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);1384    ASSERT_STREQ_LEN(written, buff, "1.6");1385 1386    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);1387    ASSERT_STREQ_LEN(written, buff, "1.3");1388 1389    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);1390    ASSERT_STREQ_LEN(written, buff, "1.8");1391 1392    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);1393    ASSERT_STREQ_LEN(written, buff, "-1.8");1394 1395    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);1396    ASSERT_STREQ_LEN(written, buff, "-1.3");1397 1398    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);1399    ASSERT_STREQ_LEN(written, buff, "-1.2");1400 1401    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);1402    ASSERT_STREQ_LEN(written, buff, "-1.7");1403 1404    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);1405    ASSERT_STREQ_LEN(written, buff, "-1.4");1406 1407    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);1408    ASSERT_STREQ_LEN(written, buff, "-1.9");1409  }1410 1411  if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {1412    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);1413    ASSERT_STREQ_LEN(written, buff, "1.7");1414 1415    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);1416    ASSERT_STREQ_LEN(written, buff, "1.2");1417 1418    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);1419    ASSERT_STREQ_LEN(written, buff, "1.1");1420 1421    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);1422    ASSERT_STREQ_LEN(written, buff, "1.6");1423 1424    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);1425    ASSERT_STREQ_LEN(written, buff, "1.3");1426 1427    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);1428    ASSERT_STREQ_LEN(written, buff, "1.8");1429 1430    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);1431    ASSERT_STREQ_LEN(written, buff, "-1.7");1432 1433    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);1434    ASSERT_STREQ_LEN(written, buff, "-1.2");1435 1436    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);1437    ASSERT_STREQ_LEN(written, buff, "-1.1");1438 1439    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);1440    ASSERT_STREQ_LEN(written, buff, "-1.6");1441 1442    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);1443    ASSERT_STREQ_LEN(written, buff, "-1.3");1444 1445    written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);1446    ASSERT_STREQ_LEN(written, buff, "-1.8");1447  }1448 1449  // Flag Tests.1450  written = LIBC_NAMESPACE::sprintf(buff, "%+f", 1.0);1451  ASSERT_STREQ_LEN(written, buff, "+1.000000");1452 1453  written = LIBC_NAMESPACE::sprintf(buff, "%+f", -1.0);1454  ASSERT_STREQ_LEN(written, buff, "-1.000000");1455 1456  written = LIBC_NAMESPACE::sprintf(buff, "% f", 1.0);1457  ASSERT_STREQ_LEN(written, buff, " 1.000000");1458 1459  written = LIBC_NAMESPACE::sprintf(buff, "% f", -1.0);1460  ASSERT_STREQ_LEN(written, buff, "-1.000000");1461 1462  written = LIBC_NAMESPACE::sprintf(buff, "%-10f", 1.5);1463  ASSERT_STREQ_LEN(written, buff, "1.500000  ");1464 1465  written = LIBC_NAMESPACE::sprintf(buff, "%#.f", 1.0);1466  ASSERT_STREQ_LEN(written, buff, "1.");1467 1468  written = LIBC_NAMESPACE::sprintf(buff, "%#.0f", 1.5);1469  ASSERT_STREQ_LEN(written, buff, "2.");1470 1471  written = LIBC_NAMESPACE::sprintf(buff, "%010f", 1.5);1472  ASSERT_STREQ_LEN(written, buff, "001.500000");1473 1474  written = LIBC_NAMESPACE::sprintf(buff, "%010f", -1.5);1475  ASSERT_STREQ_LEN(written, buff, "-01.500000");1476 1477  written = LIBC_NAMESPACE::sprintf(buff, "%+- #0f", 0.0);1478  ASSERT_STREQ_LEN(written, buff, "+0.000000");1479 1480  // Combined Tests.1481 1482  written = LIBC_NAMESPACE::sprintf(buff, "%10.2f", 9.99);1483  ASSERT_STREQ_LEN(written, buff, "      9.99");1484 1485  written = LIBC_NAMESPACE::sprintf(buff, "%5.1f", 9.99);1486  ASSERT_STREQ_LEN(written, buff, " 10.0");1487 1488  written = LIBC_NAMESPACE::sprintf(buff, "%-10.2f", 9.99);1489  ASSERT_STREQ_LEN(written, buff, "9.99      ");1490 1491  written = LIBC_NAMESPACE::sprintf(buff, "%-5.1f", 9.99);1492  ASSERT_STREQ_LEN(written, buff, "10.0 ");1493 1494  written = LIBC_NAMESPACE::sprintf(buff, "%-5.1f", 1.0e-50);1495  ASSERT_STREQ_LEN(written, buff, "0.0  ");1496 1497  written = LIBC_NAMESPACE::sprintf(buff, "%30f", 1234567890123456789.0);1498  ASSERT_STREQ_LEN(written, buff, "    1234567890123456768.000000");1499 1500  written = LIBC_NAMESPACE::sprintf(buff, "%-30f", 1234567890123456789.0);1501  ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000    ");1502 1503  written = LIBC_NAMESPACE::sprintf(buff, "%20.2f", 9999999999999.99);1504  ASSERT_STREQ_LEN(written, buff, "    9999999999999.99");1505 1506  written = LIBC_NAMESPACE::sprintf(buff, "%20.1f", 9999999999999.99);1507  ASSERT_STREQ_LEN(written, buff, "    10000000000000.0");1508 1509  written = LIBC_NAMESPACE::sprintf(buff, "%12.3f %-12.3f", 0.1, 256.0);1510  ASSERT_STREQ_LEN(written, buff, "       0.100 256.000     ");1511 1512  written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3f % 012.3f", 0.1256, 1256.0);1513  ASSERT_STREQ_LEN(written, buff, "+0.126        0001256.000");1514}1515 1516// The long double tests are separated so that their performance can be directly1517// measured.1518TEST(LlvmLibcSPrintfTest, FloatDecimalLongDoubleConv) {1519  char buff[1000];1520  int written;1521 1522  ForceRoundingMode r(RoundingMode::Nearest);1523 1524  // Length Modifier Tests.1525 1526  // TODO(michaelrj): Add tests for LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 and 1281527  // bit long double systems.1528  // TODO(michaelrj): Fix the tests to only depend on the digits the long double1529  // is accurate for.1530 1531  written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1.0L);1532  ASSERT_STREQ_LEN(written, buff, "1.000000");1533 1534  written = LIBC_NAMESPACE::sprintf(buff, "%.Lf", -2.5L);1535  ASSERT_STREQ_LEN(written, buff, "-2");1536 1537#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)1538 1539#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1540  written = LIBC_NAMESPACE::sprintf(1541      buff, "%.75Lf",1542      0.0833333333333333333355920878593448009041821933351457118988037109375L);1543  ASSERT_STREQ_LEN(written, buff,1544                   "0."1545                   "08333333333333333333559208785934480090418219333514571189880"1546                   "3710937500000000");1547 1548  written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1e100L);1549  ASSERT_STREQ_LEN(written, buff,1550                   "99999999999999999996693535322073426194986990198284960792713"1551                   "91541752018669482644324418977840117055488.000000");1552#endif1553 1554  written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 0xd.96ed1192687859ap-24L);1555  ASSERT_STREQ_LEN(written, buff, "0.000001");1556 1557  written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 10000000000000000.25L);1558  ASSERT_STREQ_LEN(written, buff, "10000000000000000.250000");1559 1560#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1561  written = LIBC_NAMESPACE::sprintf(buff, "%.510Lf", 0x8p-503L);1562  ASSERT_STREQ_LEN(1563      written, buff,1564      "0."1565      "000000000000000000000000000000000000000000000000000000000000000000000000"1566      "000000000000000000000000000000000000000000000000000000000000000000000000"1567      "000000305493636349960468205197939321361769978940274057232666389361390928"1568      "129162652472045770185723510801522825687515269359046715531785342780428396"1569      "973513311420091788963072442053377285222203558881953188370081650866793017"1570      "948791366338993705251636497892270212003524508209121908744820211960149463"1571      "721109340307985507678283651836204093399373959982767701148986816406250000"1572      "000000");1573#endif1574 1575  written = LIBC_NAMESPACE::sprintf(buff, "%.500Lf", -4327677766926336.0L);1576  ASSERT_STREQ_LEN(1577      written, buff,1578      "-4327677766926336."1579      "000000000000000000000000000000000000000000000000000000000000000000000000"1580      "000000000000000000000000000000000000000000000000000000000000000000000000"1581      "000000000000000000000000000000000000000000000000000000000000000000000000"1582      "000000000000000000000000000000000000000000000000000000000000000000000000"1583      "000000000000000000000000000000000000000000000000000000000000000000000000"1584      "000000000000000000000000000000000000000000000000000000000000000000000000"1585      "00000000000000000000000000000000000000000000000000000000000000000000");1586 1587  char big_buff[10000]; // Used for extremely wide numbers.1588 1589#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1590  written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e1000L);1591  ASSERT_STREQ_LEN(1592      written, big_buff,1593      "999999999999999999973107317669562353428234857594552594925899449376328728"1594      "202461036775511405481186963193066642191664822065529414252060696836533522"1595      "387143501724276282079456797058697369889056407118642873669166717313763499"1596      "277025985141177344925615052465165938514140943010597323750202561187880136"1597      "174810574553749194614479541820148407958204853833697063267336294787191005"1598      "628217462261955103745349844675732989944229689277833828743730290177882029"1599      "042613704915899149603539993716885598351951895974316347947147507970269673"1600      "097709017164643598452451201499004104341931127294141495501309305995449742"1601      "273419524803597130450457553871345958049837885085168840317195672271085085"1602      "950520957945970913451088104971436093671776829538796532762184174216651692"1603      "640931965387852083906784898823494867055070322768919156031682291829761007"1604      "101483799978382119231551218582499361996919560548090784230386907125151658"1605      "086767207295524036170321059257942621398084478974000973622199163292708506"1606      "2431457550909271560663602154947063707982236377366647567795879936."1607      "000000");1608 1609  written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e4900L);1610  ASSERT_STREQ_LEN(1611      written, big_buff,1612      "100000000000000000002708312230690349833224052504078834346502930111959028"1613      "517260692666637048230414374897655201843766090626319971729765251179632020"1614      "313912652522792711197087872698264530532442630109549129842736280196919130"1615      "242615101228133188193853826983121366159061148351354364472807590931218045"1616      "387490935930967150336231085015126034696883068553581691802388371635128003"1617      "615577299166097675723780877126495909902479233742826339471026068806070433"1618      "075629449530819183550315434973800271862658869400009022028602967197463980"1619      "126881829804282202449930132940824361207087494829502385835258094836304011"1620      "876250359661206802659650567866176246063987902366800491980400341950657151"1621      "370854446585517805253310195469184699955519312761482572080479702840420595"1622      "377369017651259376039167277822106875560385309101650382998482652792335482"1623      "865443482342801545877390859444282105890147577937366066315975231014810320"1624      "888482059656248277607763361589359794524314002443575149260630989130103550"1625      "443177966380769341050735632338583912575890190136462629316287947355057647"1626      "111088565611192544631519843618778618820046304429723908484879583579178075"1627      "456701368334212923379389029311286386996015804122917416008806233549005183"1628      "152461084266176543129004016414959261473645240454289630182591200574019087"1629      "358223489767381636349719510715487188747217311279465814538495924567014916"1630      "238565628036285599497236493491668884212847699052761266207598941300449276"1631      "447201387520841811835583254242213093566548778954711633721122784159793843"1632      "766802019309395771984693609426401362800013936338891483689127845928572536"1633      "790651156184721483511507878883282891696900630100211914227950790472211403"1634      "392549466062537498185758854079775888444518306635752468713312357556380082"1635      "275500658967283696421824354930077523691855699312544373220921962817907078"1636      "445538421941800259027487429330768616490865438859612697367766323925013940"1637      "918384858952407145253573823848733994146335416209309233074165707437420756"1638      "438833918763109580759409985573826485055208965115587885226774453455112406"1639      "581351429640282227888764449360534584421929291565334894907337572527922691"1640      "473242328379737396430908523008687037407295838014450772162091496534584696"1641      "605157436893236842602956298545594095307060870397506421786236892553632163"1642      "491468601982681381011940409602294892199042638682530687578982576819839451"1643      "907594697546439533559153604700750696252355362322662219852740143212566818"1644      "745528402265116534684566273868361460640280523251242059850044328669692159"1645      "629900374576027104298177006629276014371540945261309319363704125592775129"1646      "543526908667388673739382491147471395192495459318806593271282662311169392"1647      "196897003517840025298267505925987901751541005546610016067658227181318892"1648      "914686508281007582655667597441346214499847364272258631922040641860333431"1649      "409838623713258383681350233064164940590695888300919626215847587544298023"1650      "636416943680102708406086295669759876682046839368574433996997648445207805"1651      "615784339667691231286807666753972942872019850432610318031627872612657513"1652      "588188267160616660825719678199868371370527508463011236193719286066916786"1653      "169956541349011494927225747024994619057884118692213564790598702879596058"1654      "672338334720925179141906809470606964896245458600635183723159228561689808"1655      "246141482736625197373238197777325580142168245885279594913851700941789475"1656      "252421784152262567254611571822468808675893407728003047921107885664474662"1657      "930921581384003950729114103689170603748380178682003976896397305836815761"1658      "717676338115866650889936516794601457549097578905329423919798362140648664"1659      "569177147076571576101649257502509463877402424847669830852345415301684820"1660      "395813946416649808062227494112874521812750160935760825922220707178083076"1661      "380203450993589198835885505461509442443773367592842795410339065860781804"1662      "024975272228687688301824830333940416256885455008512598774611538878683158"1663      "183931461086893832255176926531299425504132104728730288984598001187854507"1664      "900417184206801359847651992484444933900133130832052346600926424167009902"1665      "829803553087005800387704758687923428053612864451456596148162238935900033"1666      "917094683141205188616000211702577553792389670853917118547527592495253773"1667      "028135298405566315903922235989614934474805789300370437580494193066066314"1668      "056627605207631392651010580925826419831250810981343093764403877594495896"1669      "516881097415880926429607388979497471571321217205535961262051641426436441"1670      "668989765107456413733909427384182109285933511623871034309722437967253289"1671      "084018145083721513211807496392673952789642893241520398827805325610653506"1672      "029060153153064455898648607959013571280930834475689835845791849456112104"1673      "462337569019001580859906425911782967213265389744605395555069797947978230"1674      "708108432086217134763779632408473684293543722127232658767439906910370146"1675      "716836295909075482355827087389127370874842532825987593970846704144140471"1676      "956027276735614286138656432085771988513977140957180090146798065497158947"1677      "229765733489703157617307078835099906185890777007500964162371428641176460"1678      "739074789794941408428328217107759915202650066155868439585510978709442590"1679      "231934194956788626761834746430104077432547436359522462253411168467463134"1680      "24896.000000");1681 1682  written =1683      LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 0xf.fffffffffffffffp+16380L);1684  ASSERT_STREQ_LEN(1685      written, big_buff,1686      "118973149535723176502126385303097020516906332229462420044032373389173700"1687      "552297072261641029033652888285354569780749557731442744315367028843419812"1688      "557385374367867359320070697326320191591828296152436552951064679108661431"1689      "179063216977883889613478656060039914875343321145491116008867984515486651"1690      "285234014977303760000912547939396622315138362241783854274391783813871780"1691      "588948754057516822634765923557697480511372564902088485522249479139937758"1692      "502601177354918009979622602685950855888360815984690023564513234659447638"1693      "493985927645628457966177293040780660922910271504608538808795932778162298"1694      "682754783076808004015069494230341172895777710033571401055977524212405734"1695      "700738625166011082837911962300846927720096515350020847447079244384854591"1696      "288672300061908512647211195136146752763351956292759795725027800298079590"1697      "419313960302147099703527646744553092202267965628099149823208332964124103"1698      "850923918473478612192169721054348428704835340811304257300221642134891734"1699      "717423480071488075100206439051723424765600472176809648610799494341570347"1700      "632064355862420744350442438056613601760883747816538902780957697597728686"1701      "007148702828795556714140463261583262360276289631617397848425448686060994"1702      "827086796804807870251185893083854658422304090880599629459458620190376604"1703      "844679092600222541053077590106576067134720012584640695703025713896098375"1704      "799892695455305236856075868317922311363951946885088077187210470520395758"1705      "748001314313144425494391994017575316933939236688185618912993172910425292"1706      "123683515992232205099800167710278403536014082929639811512287776813570604"1707      "578934353545169653956125404884644716978689321167108722908808277835051822"1708      "885764606221873970285165508372099234948333443522898475123275372663606621"1709      "390228126470623407535207172405866507951821730346378263135339370677490195"1710      "019784169044182473806316282858685774143258116536404021840272491339332094"1711      "921949842244273042701987304453662035026238695780468200360144729199712309"1712      "553005720614186697485284685618651483271597448120312194675168637934309618"1713      "961510733006555242148519520176285859509105183947250286387163249416761380"1714      "499631979144187025430270675849519200883791516940158174004671147787720145"1715      "964446117520405945350476472180797576111172084627363927960033967047003761"1716      "337450955318415007379641260504792325166135484129188421134082301547330475"1717      "406707281876350361733290800595189632520707167390454777712968226520622565"1718      "143991937680440029238090311243791261477625596469422198137514696707944687"1719      "035800439250765945161837981185939204954403611491531078225107269148697980"1720      "924094677214272701240437718740921675661363493890045123235166814608932240"1721      "069799317601780533819184998193300841098599393876029260139091141452600372"1722      "028487213241195542428210183120421610446740462163533690058366460659115629"1723      "876474552506814500393294140413149540067760295100596225302282300363147382"1724      "468105964844244132486457313743759509641616804802412935187620466813563687"1725      "753281467553879887177183651289394719533506188500326760735438867336800207"1726      "438784965701457609034985757124304510203873049485425670247933932280911052"1727      "604153852899484920399109194612991249163328991799809438033787952209313146"1728      "694614970593966415237594928589096048991612194498998638483702248667224914"1729      "892467841020618336462741696957630763248023558797524525373703543388296086"1730      "275342774001633343405508353704850737454481975472222897528108302089868263"1731      "302028525992308416805453968791141829762998896457648276528750456285492426"1732      "516521775079951625966922911497778896235667095662713848201819134832168799"1733      "586365263762097828507009933729439678463987902491451422274252700636394232"1734      "799848397673998715441855420156224415492665301451550468548925862027608576"1735      "183712976335876121538256512963353814166394951655600026415918655485005705"1736      "261143195291991880795452239464962763563017858089669222640623538289853586"1737      "759599064700838568712381032959192649484625076899225841930548076362021508"1738      "902214922052806984201835084058693849381549890944546197789302911357651677"1739      "540623227829831403347327660395223160342282471752818181884430488092132193"1740      "355086987339586127607367086665237555567580317149010847732009642431878007"1741      "000879734603290627894355374356444885190719161645514115576193939969076741"1742      "515640282654366402676009508752394550734155613586793306603174472092444651"1743      "353236664764973540085196704077110364053815007348689179836404957060618953"1744      "500508984091382686953509006678332447257871219660441528492484004185093281"1745      "190896363417573989716659600075948780061916409485433875852065711654107226"1746      "099628815012314437794400874930194474433078438899570184271000480830501217"1747      "712356062289507626904285680004771889315808935851559386317665294808903126"1748      "774702966254511086154895839508779675546413794489596052797520987481383976"1749      "257859210575628440175934932416214833956535018919681138909184379573470326"1750      "940634289008780584694035245347939808067427323629788710086717580253156130"1751      "235606487870925986528841635097252953709111431720488774740553905400942537"1752      "542411931794417513706468964386151771884986701034153254238591108962471088"1753      "538580868883777725864856414593426212108664758848926003176234596076950884"1754      "9149662444156604419552086811989770240.000000");1755#endif1756 1757  written = LIBC_NAMESPACE::sprintf(big_buff, "%.10Lf", 1e-10L);1758  ASSERT_STREQ_LEN(written, big_buff, "0.0000000001");1759 1760#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION1761  written = LIBC_NAMESPACE::sprintf(big_buff, "%.7500Lf", 1e-4900L);1762  ASSERT_STREQ_LEN(1763      written, big_buff,1764      "0."1765      "000000000000000000000000000000000000000000000000000000000000000000000000"1766      "000000000000000000000000000000000000000000000000000000000000000000000000"1767      "000000000000000000000000000000000000000000000000000000000000000000000000"1768      "000000000000000000000000000000000000000000000000000000000000000000000000"1769      "000000000000000000000000000000000000000000000000000000000000000000000000"1770      "000000000000000000000000000000000000000000000000000000000000000000000000"1771      "000000000000000000000000000000000000000000000000000000000000000000000000"1772      "000000000000000000000000000000000000000000000000000000000000000000000000"1773      "000000000000000000000000000000000000000000000000000000000000000000000000"1774      "000000000000000000000000000000000000000000000000000000000000000000000000"1775      "000000000000000000000000000000000000000000000000000000000000000000000000"1776      "000000000000000000000000000000000000000000000000000000000000000000000000"1777      "000000000000000000000000000000000000000000000000000000000000000000000000"1778      "000000000000000000000000000000000000000000000000000000000000000000000000"1779      "000000000000000000000000000000000000000000000000000000000000000000000000"1780      "000000000000000000000000000000000000000000000000000000000000000000000000"1781      "000000000000000000000000000000000000000000000000000000000000000000000000"1782      "000000000000000000000000000000000000000000000000000000000000000000000000"1783      "000000000000000000000000000000000000000000000000000000000000000000000000"1784      "000000000000000000000000000000000000000000000000000000000000000000000000"1785      "000000000000000000000000000000000000000000000000000000000000000000000000"1786      "000000000000000000000000000000000000000000000000000000000000000000000000"1787      "000000000000000000000000000000000000000000000000000000000000000000000000"1788      "000000000000000000000000000000000000000000000000000000000000000000000000"1789      "000000000000000000000000000000000000000000000000000000000000000000000000"1790      "000000000000000000000000000000000000000000000000000000000000000000000000"1791      "000000000000000000000000000000000000000000000000000000000000000000000000"1792      "000000000000000000000000000000000000000000000000000000000000000000000000"1793      "000000000000000000000000000000000000000000000000000000000000000000000000"1794      "000000000000000000000000000000000000000000000000000000000000000000000000"1795      "000000000000000000000000000000000000000000000000000000000000000000000000"1796      "000000000000000000000000000000000000000000000000000000000000000000000000"1797      "000000000000000000000000000000000000000000000000000000000000000000000000"1798      "000000000000000000000000000000000000000000000000000000000000000000000000"1799      "000000000000000000000000000000000000000000000000000000000000000000000000"1800      "000000000000000000000000000000000000000000000000000000000000000000000000"1801      "000000000000000000000000000000000000000000000000000000000000000000000000"1802      "000000000000000000000000000000000000000000000000000000000000000000000000"1803      "000000000000000000000000000000000000000000000000000000000000000000000000"1804      "000000000000000000000000000000000000000000000000000000000000000000000000"1805      "000000000000000000000000000000000000000000000000000000000000000000000000"1806      "000000000000000000000000000000000000000000000000000000000000000000000000"1807      "000000000000000000000000000000000000000000000000000000000000000000000000"1808      "000000000000000000000000000000000000000000000000000000000000000000000000"1809      "000000000000000000000000000000000000000000000000000000000000000000000000"1810      "000000000000000000000000000000000000000000000000000000000000000000000000"1811      "000000000000000000000000000000000000000000000000000000000000000000000000"1812      "000000000000000000000000000000000000000000000000000000000000000000000000"1813      "000000000000000000000000000000000000000000000000000000000000000000000000"1814      "000000000000000000000000000000000000000000000000000000000000000000000000"1815      "000000000000000000000000000000000000000000000000000000000000000000000000"1816      "000000000000000000000000000000000000000000000000000000000000000000000000"1817      "000000000000000000000000000000000000000000000000000000000000000000000000"1818      "000000000000000000000000000000000000000000000000000000000000000000000000"1819      "000000000000000000000000000000000000000000000000000000000000000000000000"1820      "000000000000000000000000000000000000000000000000000000000000000000000000"1821      "000000000000000000000000000000000000000000000000000000000000000000000000"1822      "000000000000000000000000000000000000000000000000000000000000000000000000"1823      "000000000000000000000000000000000000000000000000000000000000000000000000"1824      "000000000000000000000000000000000000000000000000000000000000000000000000"1825      "000000000000000000000000000000000000000000000000000000000000000000000000"1826      "000000000000000000000000000000000000000000000000000000000000000000000000"1827      "000000000000000000000000000000000000000000000000000000000000000000000000"1828      "000000000000000000000000000000000000000000000000000000000000000000000000"1829      "000000000000000000000000000000000000000000000000000000000000000000000000"1830      "000000000000000000000000000000000000000000000000000000000000000000000000"1831      "000000000000000000000000000000000000000000000000000000000000000000000000"1832      "000000000000000000000000000000000000000000000000000000000000000000000000"1833      "000099999999999999999996962764452956071352139203248614920751610856665084"1834      "549214352477698417183862158583009348897567779527408501588132175167211539"1835      "462139941448204886585901454195352527238724272760638086779284030512649793"1836      "039219351187928723378036480041948464946018272171365770411701020666925613"1837      "422460317465324758217878522666789603627480490870456508256359180089236338"1838      "765625231186929290294207420828927406735690318849109129700396907705735097"1839      "663944722727287361650042373203763784830198232253311807069225650324196304"1840      "532045014970637489181357566354288111205943347410488298480279857453705249"1841      "232862728556860184412369114663536200895729846877559808001004454634804626"1842      "541455540260282018142615835686583304903486353937549394736905011798466731"1843      "536563240053860118551127061960208467764243724656897127545613968909523389"1844      "577188368809623987105800147797280462974804046545425080530020901531407223"1845      "191237123282274818236437397994019915368657474589800678444589412286037789"1846      "891525464936023205313685584525510094270344601331453730179416773626565262"1847      "480345858564672442896904520146956686863172737711483866766404977719744767"1848      "834324844875237277613991088218774564658513875732403456058414595576806383"1849      "115554713240005982141397577420073082470139244845624915873825746771661332"1850      "098677966580506186966978746832443976821987300902957597498388211921362869"1851      "017846215557612829071692275292036211064515305528052919611691470945774714"1852      "135516559501572279732350629089770249554808690411603894492333360300589658"1853      "470898965370892774715815089075170720164713889237058574941489766701880158"1854      "060081295483989540170337129032188818293132770882381428397119039835946745"1855      "549356649433406617266370644136291924838857814675939156677910783740103207"1856      "523299367093130816446415259371931925208362367989095199399211644084543790"1857      "110432339056231037520216864358899218874658268610955002763260912337688947"1858      "822453100821038299301092582962825965939081817836419126254832772002214908"1859      "085575905761843610944187009818156363893015929300295112598059949496854566"1860      "638748010633726861510500653821408135845840123073754133549077708843800674"1861      "328440913743105608636458354618912183716456158809545183074062249922212944"1862      "249667793845728355381309084891765979111348980470647082269921872595470473"1863      "719354467594516320911964549508538492057120740224559944452120552719041944"1864      "961475548547884309626382512432626380881023756568143060204097921571153170"1865      "723817845809196253498326358439807445210362177680590181657555380795450462"1866      "223805222580359379367452693270553602179122419370586308101820559214330382"1867      "570449525088342437216896462077260223998756027453411520977536701491759878"1868      "422771447006016890777855573925295187921971811871399320142563330377888532"1869      "179817332113");1870#endif1871#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT801872 1873#if defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)1874  // Some exceptionally difficult cases for 39-digit precision. (That's the1875  // number of digits supported by the float320 algorithm, and should still be1876  // correct under other algorithms. So these are still enabled even under1877  // LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION.)1878  //1879  // These were found by number-theoretic search to be the worst cases in terms1880  // of being extremely close to the rounding boundary between two possible1881  // decimal outputs. For example, the first of these cases has a true value1882  // beginning with1883  //1884  // 2.2457869644188155228316136144221128387950000000000000000001885  //                                          0000000000000000010767969...1886  //1887  // so you need to compute a _long_ way past the 39th digit to find out1888  // whether to round the ...8795 up to 880 or not!1889  //1890  // The first half of these cases all rounded up; the second half all rounded1891  // down. You can see that in both sections the final decimal digit is1892  // sometimes odd and sometimes even, ruling out the possibility that we're1893  // getting these right by mistakenly assuming them to be _exactly_ on the1894  // boundary.1895 1896  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1897                                    0x1.bde5716bba8d70255b4be10e0a0ap-3388L);1898  ASSERT_STREQ_LEN(written, buff,1899                   "2.24578696441881552283161361442211283880e-1020");1900  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1901                                    0x1.64b78defc8712684490980d80808p-3391L);1902  ASSERT_STREQ_LEN(written, buff,1903                   "2.24578696441881552283161361442211283880e-1021");1904  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1905                                    0x1.c0eed9d1ea4b6f215accb15cb42cp-4714L);1906  ASSERT_STREQ_LEN(written, buff,1907                   "1.54362575487963943466308346767014523161e-1419");1908  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1909                                    0x1.a393eaafc3dbabfcd30442cef525p-12600L);1910  ASSERT_STREQ_LEN(written, buff,1911                   "1.72435694193924008931441874634575361189e-3793");1912  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1913                                    0x1.b7a5248baf85133c9b7bf3241f75p+11050L);1914  ASSERT_STREQ_LEN(written, buff,1915                   "4.13346579244549095104252956440178208514e+3326");1916  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1917                                    0x1.81bf6d977f99ff7bd9debdd52815p+1359L);1918  ASSERT_STREQ_LEN(written, buff,1919                   "1.89595297593127274811683259716608232064e+409");1920  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1921                                    0x1.fcb9cfd65f068b758d30ba19a494p-4451L);1922  ASSERT_STREQ_LEN(written, buff,1923                   "2.59258570015527007681686041122929728653e-1340");1924  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1925                                    0x1.7d8b5be0c744e89829e48b933b6fp-4448L);1926  ASSERT_STREQ_LEN(written, buff,1927                   "1.55555142009316204609011624673757837192e-1339");1928  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1929                                    0x1.dbb1f01aef7b93c37ca00217888cp-12205L);1930  ASSERT_STREQ_LEN(written, buff,1931                   "1.57758077908296078543773740016012372216e-3674");1932  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1933                                    0x1.fb037d72fdf1a8aa8bdfc2586fe3p+2580L);1934  ASSERT_STREQ_LEN(written, buff,1935                   "8.99846610004600287527755301065037553046e+776");1936 1937  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1938                                    0x1.9af8fe5febf751a795292e30335dp+2052L);1939  ASSERT_STREQ_LEN(written, buff,1940                   "8.30087814106622071390265113980150545241e+617");1941  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1942                                    0x1.48c731e6565f748610edbe8cf5e4p+2049L);1943  ASSERT_STREQ_LEN(written, buff,1944                   "8.30087814106622071390265113980150545241e+616");1945  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1946                                    0x1.8e78bc76e98998b7bbf6c8f80f2ap-5671L);1947  ASSERT_STREQ_LEN(written, buff,1948                   "1.12473970318904704063044350553302771341e-1707");1949  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1950                                    0x1.59a832c16a7797aec70196ddf9dbp-16181L);1951  ASSERT_STREQ_LEN(written, buff,1952                   "1.45896738321434823250358135932839533040e-4871");1953  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1954                                    0x1.14868f0121f946256c01457e617cp-16184L);1955  ASSERT_STREQ_LEN(written, buff,1956                   "1.45896738321434823250358135932839533040e-4872");1957  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1958                                    0x1.0ca8c4b525b1128506cdc668df43p+11017L);1959  ASSERT_STREQ_LEN(written, buff,1960                   "2.94051951004764266903705588743096762647e+3316");1961  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1962                                    0x1.fcd40bb49b18aa19d66a3c5572dep+5547L);1963  ASSERT_STREQ_LEN(written, buff,1964                   "1.29335350323078956384272678475060580129e+1670");1965  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1966                                    0x1.0e5e51510a653e744d6b84efed86p-13613L);1967  ASSERT_STREQ_LEN(written, buff,1968                   "1.26585813611514592337442314391432904094e-4098");1969  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1970                                    0x1.ff41f8aa97e676e95b1a6a7751fap+16366L);1971  ASSERT_STREQ_LEN(written, buff,1972                   "9.06377119787295161934827646572467920486e+4926");1973  written = LIBC_NAMESPACE::sprintf(buff, "%#.39Lg",1974                                    0x1.4770bf66ccafd7d80ac9bb3dded7p-1843L);1975  ASSERT_STREQ_LEN(written, buff,1976                   "2.03521509642091239545213340619368190283e-555");1977 1978#endif // LIBC_TYPES_LONG_DOUBLE_IS_FLOAT1281979}1980 1981TEST(LlvmLibcSPrintfTest, FloatExponentConv) {1982  char buff[1000];1983  int written;1984 1985  ForceRoundingMode r(RoundingMode::Nearest);1986  double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();1987  double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();1988 1989  written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0);1990  ASSERT_STREQ_LEN(written, buff, "1.000000e+00");1991 1992  written = LIBC_NAMESPACE::sprintf(buff, "%E", -1.0);1993  ASSERT_STREQ_LEN(written, buff, "-1.000000E+00");1994 1995  written = LIBC_NAMESPACE::sprintf(buff, "%e", -1.234567);1996  ASSERT_STREQ_LEN(written, buff, "-1.234567e+00");1997 1998  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0);1999  ASSERT_STREQ_LEN(written, buff, "0.000000e+00");2000 2001  written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.5);2002  ASSERT_STREQ_LEN(written, buff, "1.500000e+00");2003 2004  written = LIBC_NAMESPACE::sprintf(buff, "%e", 1e300);2005  ASSERT_STREQ_LEN(written, buff, "1.000000e+300");2006 2007  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.1);2008  ASSERT_STREQ_LEN(written, buff, "1.000000e-01");2009 2010  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.001);2011  ASSERT_STREQ_LEN(written, buff, "1.000000e-03");2012 2013  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.00001);2014  ASSERT_STREQ_LEN(written, buff, "1.000000e-05");2015 2016  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0000001);2017  ASSERT_STREQ_LEN(written, buff, "1.000000e-07");2018 2019  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.000000001);2020  ASSERT_STREQ_LEN(written, buff, "1.000000e-09");2021 2022  written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0e-20);2023  ASSERT_STREQ_LEN(written, buff, "1.000000e-20");2024 2025  written = LIBC_NAMESPACE::sprintf(buff, "%e", 1234567890123456789.0);2026  ASSERT_STREQ_LEN(written, buff, "1.234568e+18");2027 2028  written = LIBC_NAMESPACE::sprintf(buff, "%e", 9999999000000.00);2029  ASSERT_STREQ_LEN(written, buff, "9.999999e+12");2030 2031  // Simple Subnormal Tests.2032 2033  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1027);2034  ASSERT_STREQ_LEN(written, buff, "6.953356e-310");2035 2036  written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1074);2037  ASSERT_STREQ_LEN(written, buff, "4.940656e-324");2038 2039  // Inf/Nan Tests.2040 2041  written = LIBC_NAMESPACE::sprintf(buff, "%e", inf);2042  ASSERT_STREQ_LEN(written, buff, "inf");2043 2044  written = LIBC_NAMESPACE::sprintf(buff, "%E", -inf);2045  ASSERT_STREQ_LEN(written, buff, "-INF");2046 2047  written = LIBC_NAMESPACE::sprintf(buff, "%e", nan);2048  ASSERT_STREQ_LEN(written, buff, "nan");2049 2050  written = LIBC_NAMESPACE::sprintf(buff, "%E", -nan);2051  ASSERT_STREQ_LEN(written, buff, "-NAN");2052 2053  // Min Width Tests.2054 2055  written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0);2056  ASSERT_STREQ_LEN(written, buff, "   1.000000e+00");2057 2058  written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0);2059  ASSERT_STREQ_LEN(written, buff, "  -1.000000e+00");2060 2061  written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0e5);2062  ASSERT_STREQ_LEN(written, buff, "   1.000000e+05");2063 2064  written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0e5);2065  ASSERT_STREQ_LEN(written, buff, "  -1.000000e+05");2066 2067  written = LIBC_NAMESPACE::sprintf(buff, "%10e", 1.0e-5);2068  ASSERT_STREQ_LEN(written, buff, "1.000000e-05");2069 2070  // Precision Tests.2071 2072  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.0);2073  ASSERT_STREQ_LEN(written, buff, "1.0e+00");2074 2075  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.0);2076  ASSERT_STREQ_LEN(written, buff, "0.0e+00");2077 2078  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 0.0);2079  ASSERT_STREQ_LEN(written, buff, "0e+00");2080 2081  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.1);2082  ASSERT_STREQ_LEN(written, buff, "1.0e-01");2083 2084  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.09);2085  ASSERT_STREQ_LEN(written, buff, "1.1e+00");2086 2087  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.04);2088  ASSERT_STREQ_LEN(written, buff, "1.0e+00");2089 2090  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.19);2091  ASSERT_STREQ_LEN(written, buff, "1.2e+00");2092 2093  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.99);2094  ASSERT_STREQ_LEN(written, buff, "2.0e+00");2095 2096  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99);2097  ASSERT_STREQ_LEN(written, buff, "1.0e+01");2098 2099  written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 99.9);2100  ASSERT_STREQ_LEN(written, buff, "9.99e+01");2101 2102  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 99.9);2103  ASSERT_STREQ_LEN(written, buff, "1.0e+02");2104 2105  written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.25);2106  ASSERT_STREQ_LEN(written, buff, "1.25000e+00");2107 2108  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.25);2109  ASSERT_STREQ_LEN(written, buff, "1e+00");2110 2111  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.75);2112  ASSERT_STREQ_LEN(written, buff, "2e+00");2113 2114  written = LIBC_NAMESPACE::sprintf(buff, "%.20e", 1.234e-10);2115  ASSERT_STREQ_LEN(written, buff, "1.23400000000000008140e-10");2116 2117  written = LIBC_NAMESPACE::sprintf(buff, "%.2e", -9.99);2118  ASSERT_STREQ_LEN(written, buff, "-9.99e+00");2119 2120  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -9.99);2121  ASSERT_STREQ_LEN(written, buff, "-1.0e+01");2122 2123  written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 0.0);2124  ASSERT_STREQ_LEN(written, buff, "0.00000e+00");2125 2126  written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008);2127  ASSERT_STREQ_LEN(written, buff, "1.00800e+00");2128 2129  written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008e3);2130  ASSERT_STREQ_LEN(written, buff, "1.00800e+03");2131 2132  // These tests also focus on rounding. Almost all of them have a 5 right after2133  // the printed string (e.g. 9.5 with precision 0 prints 0 digits after the2134  // decimal point). This is again because rounding a number with a 5 after the2135  // printed section means that more digits have to be checked to determine if2136  // this should be rounded up (if there are non-zero digits after the 5) or to2137  // even (if the 5 is the last non-zero digit). Additionally, the algorithm for2138  // checking if a number is all 0s after the decimal point may not work since2139  // the decimal point moves in this representation.2140  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 2.5812229360061737E+200);2141  ASSERT_STREQ_LEN(written, buff, "3e+200");2142 2143  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.059E+200);2144  ASSERT_STREQ_LEN(written, buff, "9.1e+200");2145 2146  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.059E+200);2147  ASSERT_STREQ_LEN(written, buff, "9e+200");2148 2149#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2150  written = LIBC_NAMESPACE::sprintf(buff, "%.166e", 1.131959884853339E-72);2151  ASSERT_STREQ_LEN(written, buff,2152                   "1."2153                   "13195988485333904593863991136097397258531639976739227369782"2154                   "68612419376648241056393424414314951197624317440549121097287"2155                   "069853416091591569170304865110665559768676757812e-72");2156#endif2157 2158  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.5);2159  ASSERT_STREQ_LEN(written, buff, "1e+01");2160 2161  written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 1.9999999999890936);2162  ASSERT_STREQ_LEN(written, buff, "2.0000000000e+00");2163 2164  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 745362143563.03894);2165  ASSERT_STREQ_LEN(written, buff, "7.5e+11");2166 2167  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 45181042688.0);2168  ASSERT_STREQ_LEN(written, buff, "5e+10");2169 2170  written = LIBC_NAMESPACE::sprintf(buff, "%.35e", 1.3752441369139243);2171  ASSERT_STREQ_LEN(written, buff, "1.37524413691392433101157166674965993e+00");2172 2173  // Subnormal Precision Tests2174 2175#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2176  written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1022);2177  ASSERT_STREQ_LEN(2178      written, buff,2179      "2."2180      "225073858507201383090232717332404064219215980462331830553327416887204434"2181      "813918195854283159012511020564067339731035811005152434161553460108856012"2182      "385377718821130777993532002330479610147442583636071921565046942503734208"2183      "375250806650616658158948720491179968591639648500635908770118304874799780"2184      "8877537499494515804516e-308");2185#endif2186 2187  written = LIBC_NAMESPACE::sprintf(buff, "%.30e", 0x1.0p-1022);2188  ASSERT_STREQ_LEN(written, buff, "2.225073858507201383090232717332e-308");2189 2190#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2191  written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1023);2192  ASSERT_STREQ_LEN(2193      written, buff,2194      "1."2195      "112536929253600691545116358666202032109607990231165915276663708443602217"2196      "406959097927141579506255510282033669865517905502576217080776730054428006"2197      "192688859410565388996766001165239805073721291818035960782523471251867104"2198      "187625403325308329079474360245589984295819824250317954385059152437399890"2199      "4438768749747257902258e-308");2200#endif2201 2202  written = LIBC_NAMESPACE::sprintf(buff, "%.6e", 9.99999e-310);2203  ASSERT_STREQ_LEN(written, buff, "9.999990e-310");2204 2205  written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 9.99999e-310);2206  ASSERT_STREQ_LEN(written, buff, "9.99999e-310");2207 2208  written = LIBC_NAMESPACE::sprintf(buff, "%.4e", 9.99999e-310);2209  ASSERT_STREQ_LEN(written, buff, "1.0000e-309");2210 2211  written = LIBC_NAMESPACE::sprintf(buff, "%.3e", 9.99999e-310);2212  ASSERT_STREQ_LEN(written, buff, "1.000e-309");2213 2214  written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 9.99999e-310);2215  ASSERT_STREQ_LEN(written, buff, "1.00e-309");2216 2217  written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99999e-310);2218  ASSERT_STREQ_LEN(written, buff, "1.0e-309");2219 2220  written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.99999e-310);2221  ASSERT_STREQ_LEN(written, buff, "1e-309");2222 2223  written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 0x1.0p-1074);2224  ASSERT_STREQ_LEN(written, buff, "4.9406564584e-324");2225 2226  // Rounding Mode Tests.2227 2228  if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {2229    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2230    ASSERT_STREQ_LEN(written, buff, "1.8e+00");2231 2232    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2233    ASSERT_STREQ_LEN(written, buff, "1.2e+00");2234 2235    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2236    ASSERT_STREQ_LEN(written, buff, "1.1e+00");2237 2238    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2239    ASSERT_STREQ_LEN(written, buff, "1.6e+00");2240 2241    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2242    ASSERT_STREQ_LEN(written, buff, "1.4e+00");2243 2244    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2245    ASSERT_STREQ_LEN(written, buff, "1.9e+00");2246 2247    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2248    ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2249 2250    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2251    ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2252 2253    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2254    ASSERT_STREQ_LEN(written, buff, "-1.1e+00");2255 2256    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2257    ASSERT_STREQ_LEN(written, buff, "-1.6e+00");2258 2259    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2260    ASSERT_STREQ_LEN(written, buff, "-1.4e+00");2261 2262    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2263    ASSERT_STREQ_LEN(written, buff, "-1.9e+00");2264  }2265 2266  if (ForceRoundingMode r(RoundingMode::Upward); r.success) {2267    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2268    ASSERT_STREQ_LEN(written, buff, "1.8e+00");2269 2270    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2271    ASSERT_STREQ_LEN(written, buff, "1.3e+00");2272 2273    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2274    ASSERT_STREQ_LEN(written, buff, "1.2e+00");2275 2276    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2277    ASSERT_STREQ_LEN(written, buff, "1.7e+00");2278 2279    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2280    ASSERT_STREQ_LEN(written, buff, "1.4e+00");2281 2282    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2283    ASSERT_STREQ_LEN(written, buff, "1.9e+00");2284 2285    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2286    ASSERT_STREQ_LEN(written, buff, "-1.7e+00");2287 2288    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2289    ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2290 2291    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2292    ASSERT_STREQ_LEN(written, buff, "-1.1e+00");2293 2294    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2295    ASSERT_STREQ_LEN(written, buff, "-1.6e+00");2296 2297    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2298    ASSERT_STREQ_LEN(written, buff, "-1.3e+00");2299 2300    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2301    ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2302  }2303 2304  if (ForceRoundingMode r(RoundingMode::Downward); r.success) {2305    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2306    ASSERT_STREQ_LEN(written, buff, "1.7e+00");2307 2308    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2309    ASSERT_STREQ_LEN(written, buff, "1.2e+00");2310 2311    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2312    ASSERT_STREQ_LEN(written, buff, "1.1e+00");2313 2314    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2315    ASSERT_STREQ_LEN(written, buff, "1.6e+00");2316 2317    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2318    ASSERT_STREQ_LEN(written, buff, "1.3e+00");2319 2320    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2321    ASSERT_STREQ_LEN(written, buff, "1.8e+00");2322 2323    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2324    ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2325 2326    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2327    ASSERT_STREQ_LEN(written, buff, "-1.3e+00");2328 2329    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2330    ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2331 2332    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2333    ASSERT_STREQ_LEN(written, buff, "-1.7e+00");2334 2335    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2336    ASSERT_STREQ_LEN(written, buff, "-1.4e+00");2337 2338    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2339    ASSERT_STREQ_LEN(written, buff, "-1.9e+00");2340  }2341 2342  if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {2343    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);2344    ASSERT_STREQ_LEN(written, buff, "1.7e+00");2345 2346    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);2347    ASSERT_STREQ_LEN(written, buff, "1.2e+00");2348 2349    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);2350    ASSERT_STREQ_LEN(written, buff, "1.1e+00");2351 2352    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);2353    ASSERT_STREQ_LEN(written, buff, "1.6e+00");2354 2355    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);2356    ASSERT_STREQ_LEN(written, buff, "1.3e+00");2357 2358    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);2359    ASSERT_STREQ_LEN(written, buff, "1.8e+00");2360 2361    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);2362    ASSERT_STREQ_LEN(written, buff, "-1.7e+00");2363 2364    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);2365    ASSERT_STREQ_LEN(written, buff, "-1.2e+00");2366 2367    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);2368    ASSERT_STREQ_LEN(written, buff, "-1.1e+00");2369 2370    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);2371    ASSERT_STREQ_LEN(written, buff, "-1.6e+00");2372 2373    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);2374    ASSERT_STREQ_LEN(written, buff, "-1.3e+00");2375 2376    written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);2377    ASSERT_STREQ_LEN(written, buff, "-1.8e+00");2378  }2379 2380  // Flag Tests.2381  written = LIBC_NAMESPACE::sprintf(buff, "%+e", 1.0);2382  ASSERT_STREQ_LEN(written, buff, "+1.000000e+00");2383 2384  written = LIBC_NAMESPACE::sprintf(buff, "%+e", -1.0);2385  ASSERT_STREQ_LEN(written, buff, "-1.000000e+00");2386 2387  written = LIBC_NAMESPACE::sprintf(buff, "% e", 1.0);2388  ASSERT_STREQ_LEN(written, buff, " 1.000000e+00");2389 2390  written = LIBC_NAMESPACE::sprintf(buff, "% e", -1.0);2391  ASSERT_STREQ_LEN(written, buff, "-1.000000e+00");2392 2393  written = LIBC_NAMESPACE::sprintf(buff, "%-15e", 1.5);2394  ASSERT_STREQ_LEN(written, buff, "1.500000e+00   ");2395 2396  written = LIBC_NAMESPACE::sprintf(buff, "%#.e", 1.0);2397  ASSERT_STREQ_LEN(written, buff, "1.e+00");2398 2399  written = LIBC_NAMESPACE::sprintf(buff, "%#.0e", 1.5);2400  ASSERT_STREQ_LEN(written, buff, "2.e+00");2401 2402  written = LIBC_NAMESPACE::sprintf(buff, "%015e", 1.5);2403  ASSERT_STREQ_LEN(written, buff, "0001.500000e+00");2404 2405  written = LIBC_NAMESPACE::sprintf(buff, "%015e", -1.5);2406  ASSERT_STREQ_LEN(written, buff, "-001.500000e+00");2407 2408  written = LIBC_NAMESPACE::sprintf(buff, "%+- #0e", 0.0);2409  ASSERT_STREQ_LEN(written, buff, "+0.000000e+00");2410 2411  // Combined Tests.2412 2413  written = LIBC_NAMESPACE::sprintf(buff, "%10.2e", 9.99);2414  ASSERT_STREQ_LEN(written, buff, "  9.99e+00");2415 2416  written = LIBC_NAMESPACE::sprintf(buff, "%10.1e", 9.99);2417  ASSERT_STREQ_LEN(written, buff, "   1.0e+01");2418 2419  written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 9.99);2420  ASSERT_STREQ_LEN(written, buff, "     1e+01");2421 2422  written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 0.0999);2423  ASSERT_STREQ_LEN(written, buff, "     1e-01");2424 2425  written = LIBC_NAMESPACE::sprintf(buff, "%-10.2e", 9.99);2426  ASSERT_STREQ_LEN(written, buff, "9.99e+00  ");2427 2428  written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 9.99);2429  ASSERT_STREQ_LEN(written, buff, "1.0e+01   ");2430 2431  written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 1.0e-50);2432  ASSERT_STREQ_LEN(written, buff, "1.0e-50   ");2433 2434  written = LIBC_NAMESPACE::sprintf(buff, "%30e", 1234567890123456789.0);2435  ASSERT_STREQ_LEN(written, buff, "                  1.234568e+18");2436 2437  written = LIBC_NAMESPACE::sprintf(buff, "%-30e", 1234567890123456789.0);2438  ASSERT_STREQ_LEN(written, buff, "1.234568e+18                  ");2439 2440  written = LIBC_NAMESPACE::sprintf(buff, "%25.14e", 9999999999999.99);2441  ASSERT_STREQ_LEN(written, buff, "     9.99999999999999e+12");2442 2443  written = LIBC_NAMESPACE::sprintf(buff, "%25.13e", 9999999999999.99);2444  ASSERT_STREQ_LEN(written, buff, "      1.0000000000000e+13");2445 2446  written = LIBC_NAMESPACE::sprintf(buff, "%25.12e", 9999999999999.99);2447  ASSERT_STREQ_LEN(written, buff, "       1.000000000000e+13");2448 2449  written = LIBC_NAMESPACE::sprintf(buff, "%12.3e %-12.3e", 0.1, 256.0);2450  ASSERT_STREQ_LEN(written, buff, "   1.000e-01 2.560e+02   ");2451 2452  written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3e % 012.3e", 0.1256, 1256.0);2453  ASSERT_STREQ_LEN(written, buff, "+1.256e-01    001.256e+03");2454}2455 2456TEST(LlvmLibcSPrintfTest, FloatExponentLongDoubleConv) {2457  char buff[1000];2458  int written;2459 2460  ForceRoundingMode r(RoundingMode::Nearest);2461  // Length Modifier Tests.2462 2463  written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.1L);2464  ASSERT_STREQ_LEN(written, buff, "1.000000001e+18");2465 2466  written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.0L);2467  ASSERT_STREQ_LEN(written, buff, "1.000000000e+18");2468 2469  written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e100L);2470  ASSERT_STREQ_LEN(written, buff, "1.000000e+100");2471 2472  written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.0L);2473  ASSERT_STREQ_LEN(written, buff, "1.000000e+00");2474 2475#if !defined(LIBC_TYPES_LONG_DOUBLE_IS_DOUBLE)2476  written = LIBC_NAMESPACE::sprintf(buff, "%Le", 0xf.fffffffffffffffp+16380L);2477  ASSERT_STREQ_LEN(written, buff, "1.189731e+4932");2478 2479  written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e1000L);2480  ASSERT_STREQ_LEN(written, buff, "1.000000e+1000");2481 2482  written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e4900L);2483  ASSERT_STREQ_LEN(written, buff, "1.000000e+4900");2484 2485  written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.2345678e4900L);2486  ASSERT_STREQ_LEN(written, buff, "1.234568e+4900");2487#endif2488}2489 2490TEST(LlvmLibcSPrintfTest, FloatAutoConv) {2491  char buff[1000];2492  int written;2493 2494  ForceRoundingMode r(RoundingMode::Nearest);2495  double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();2496  double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();2497 2498  written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0);2499  ASSERT_STREQ_LEN(written, buff, "1");2500 2501  written = LIBC_NAMESPACE::sprintf(buff, "%G", -1.0);2502  ASSERT_STREQ_LEN(written, buff, "-1");2503 2504  written = LIBC_NAMESPACE::sprintf(buff, "%g", -1.234567);2505  ASSERT_STREQ_LEN(written, buff, "-1.23457");2506 2507  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0);2508  ASSERT_STREQ_LEN(written, buff, "0");2509 2510  written = LIBC_NAMESPACE::sprintf(buff, "%g", -0.0);2511  ASSERT_STREQ_LEN(written, buff, "-0");2512 2513  written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.5);2514  ASSERT_STREQ_LEN(written, buff, "1.5");2515 2516  written = LIBC_NAMESPACE::sprintf(buff, "%g", 1e300);2517  ASSERT_STREQ_LEN(written, buff, "1e+300");2518 2519  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.1);2520  ASSERT_STREQ_LEN(written, buff, "0.1");2521 2522  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.001);2523  ASSERT_STREQ_LEN(written, buff, "0.001");2524 2525  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.00001);2526  ASSERT_STREQ_LEN(written, buff, "1e-05");2527 2528  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0000001);2529  ASSERT_STREQ_LEN(written, buff, "1e-07");2530 2531  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.000000001);2532  ASSERT_STREQ_LEN(written, buff, "1e-09");2533 2534  written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0e-20);2535  ASSERT_STREQ_LEN(written, buff, "1e-20");2536 2537  written = LIBC_NAMESPACE::sprintf(buff, "%g", 1234567890123456789.0);2538  ASSERT_STREQ_LEN(written, buff, "1.23457e+18");2539 2540  written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999990000000.00);2541  ASSERT_STREQ_LEN(written, buff, "9.99999e+12");2542 2543  written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999999000000.00);2544  ASSERT_STREQ_LEN(written, buff, "1e+13");2545 2546  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0xa.aaaaaaaaaaaaaabp-7);2547  ASSERT_STREQ_LEN(written, buff, "0.0833333");2548 2549  // Simple Subnormal Tests.2550 2551  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1027);2552  ASSERT_STREQ_LEN(written, buff, "6.95336e-310");2553 2554  written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1074);2555  ASSERT_STREQ_LEN(written, buff, "4.94066e-324");2556 2557  // Inf/Nan Tests.2558 2559  written = LIBC_NAMESPACE::sprintf(buff, "%g", inf);2560  ASSERT_STREQ_LEN(written, buff, "inf");2561 2562  written = LIBC_NAMESPACE::sprintf(buff, "%G", -inf);2563  ASSERT_STREQ_LEN(written, buff, "-INF");2564 2565  written = LIBC_NAMESPACE::sprintf(buff, "%g", nan);2566  ASSERT_STREQ_LEN(written, buff, "nan");2567 2568  written = LIBC_NAMESPACE::sprintf(buff, "%G", -nan);2569  ASSERT_STREQ_LEN(written, buff, "-NAN");2570 2571  // Min Width Tests.2572 2573  written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0);2574  ASSERT_STREQ_LEN(written, buff, "              1");2575 2576  written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0);2577  ASSERT_STREQ_LEN(written, buff, "             -1");2578 2579  written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0e5);2580  ASSERT_STREQ_LEN(written, buff, "         100000");2581 2582  written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0e5);2583  ASSERT_STREQ_LEN(written, buff, "        -100000");2584 2585  written = LIBC_NAMESPACE::sprintf(buff, "%10g", 1.0e-5);2586  ASSERT_STREQ_LEN(written, buff, "     1e-05");2587 2588  // Precision Tests.2589 2590  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.23456789);2591  ASSERT_STREQ_LEN(written, buff, "1.2");2592 2593  // Trimming trailing zeroes causes the precision to be ignored here.2594  written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 0.0);2595  ASSERT_STREQ_LEN(written, buff, "0");2596 2597  written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 0.0);2598  ASSERT_STREQ_LEN(written, buff, "0");2599 2600  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 0.1);2601  ASSERT_STREQ_LEN(written, buff, "0.1");2602 2603  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.09);2604  ASSERT_STREQ_LEN(written, buff, "1.1");2605 2606  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.04);2607  ASSERT_STREQ_LEN(written, buff, "1");2608 2609  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.19);2610  ASSERT_STREQ_LEN(written, buff, "1.2");2611 2612  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.99);2613  ASSERT_STREQ_LEN(written, buff, "2");2614 2615  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99);2616  ASSERT_STREQ_LEN(written, buff, "10");2617 2618  written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 99.9);2619  ASSERT_STREQ_LEN(written, buff, "99.9");2620 2621  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 99.9);2622  ASSERT_STREQ_LEN(written, buff, "1e+02");2623 2624  written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 99.9);2625  ASSERT_STREQ_LEN(written, buff, "1e+02");2626 2627  written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.25);2628  ASSERT_STREQ_LEN(written, buff, "1.25");2629 2630  written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.25);2631  ASSERT_STREQ_LEN(written, buff, "1");2632 2633  written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.75);2634  ASSERT_STREQ_LEN(written, buff, "2");2635 2636  written = LIBC_NAMESPACE::sprintf(buff, "%.20g", 1.234e-10);2637  ASSERT_STREQ_LEN(written, buff, "1.2340000000000000814e-10");2638 2639  written = LIBC_NAMESPACE::sprintf(buff, "%.3g", -9.99);2640  ASSERT_STREQ_LEN(written, buff, "-9.99");2641 2642  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -9.99);2643  ASSERT_STREQ_LEN(written, buff, "-10");2644 2645  written = LIBC_NAMESPACE::sprintf(buff, "%.1g", -9.99);2646  ASSERT_STREQ_LEN(written, buff, "-1e+01");2647 2648  written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008);2649  ASSERT_STREQ_LEN(written, buff, "1.008");2650 2651  written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008e3);2652  ASSERT_STREQ_LEN(written, buff, "1008");2653 2654  written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9999.0);2655  ASSERT_STREQ_LEN(written, buff, "9999");2656 2657  written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9999.0);2658  ASSERT_STREQ_LEN(written, buff, "1e+04");2659 2660  written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 1256.0);2661  ASSERT_STREQ_LEN(written, buff, "1.26e+03");2662 2663  // Found through large scale testing.2664  written = LIBC_NAMESPACE::sprintf(buff, "%.15g", 22.25);2665  ASSERT_STREQ_LEN(written, buff, "22.25");2666 2667  // These tests also focus on rounding, but only in how it relates to the base2668  // 10 exponent. The %g conversion selects between being a %f or %e conversion2669  // based on what the exponent would be if it was %e. If we call the precision2670  // P (equal to 6 if the precision is not set, 0 if the provided precision is2671  // 0, and provided precision - 1 otherwise) and the exponent X, then the style2672  // is %f with an effective precision of P - X + 1 if P > X >= -4, else the2673  // style is %e with effective precision P - 1. Additionally, it attempts to2674  // trim zeros that would be displayed after the decimal point.2675  written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.059E+200);2676  ASSERT_STREQ_LEN(written, buff, "9e+200");2677 2678  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.059E+200);2679  ASSERT_STREQ_LEN(written, buff, "9.1e+200");2680 2681  // For this test, P = 0 and X = 1, so P > X >= -4 is false, giving a %e style.2682  written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.5);2683  ASSERT_STREQ_LEN(written, buff, "1e+01");2684 2685  // Subnormal Precision Tests2686#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2687  written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1022);2688  ASSERT_STREQ_LEN(2689      written, buff,2690      "2."2691      "225073858507201383090232717332404064219215980462331830553327416887204434"2692      "813918195854283159012511020564067339731035811005152434161553460108856012"2693      "385377718821130777993532002330479610147442583636071921565046942503734208"2694      "375250806650616658158948720491179968591639648500635908770118304874799780"2695      "887753749949451580452e-308");2696#endif2697 2698  written = LIBC_NAMESPACE::sprintf(buff, "%.30g", 0x1.0p-1022);2699  ASSERT_STREQ_LEN(written, buff, "2.22507385850720138309023271733e-308");2700 2701#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2702  written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1023);2703  ASSERT_STREQ_LEN(2704      written, buff,2705      "1."2706      "112536929253600691545116358666202032109607990231165915276663708443602217"2707      "406959097927141579506255510282033669865517905502576217080776730054428006"2708      "192688859410565388996766001165239805073721291818035960782523471251867104"2709      "187625403325308329079474360245589984295819824250317954385059152437399890"2710      "443876874974725790226e-308");2711#endif2712 2713  written = LIBC_NAMESPACE::sprintf(buff, "%.7g", 9.99999e-310);2714  ASSERT_STREQ_LEN(written, buff, "9.99999e-310");2715 2716  written = LIBC_NAMESPACE::sprintf(buff, "%.6g", 9.99999e-310);2717  ASSERT_STREQ_LEN(written, buff, "9.99999e-310");2718 2719  written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 9.99999e-310);2720  ASSERT_STREQ_LEN(written, buff, "1e-309");2721 2722  written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9.99999e-310);2723  ASSERT_STREQ_LEN(written, buff, "1e-309");2724 2725  written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9.99999e-310);2726  ASSERT_STREQ_LEN(written, buff, "1e-309");2727 2728  written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99999e-310);2729  ASSERT_STREQ_LEN(written, buff, "1e-309");2730 2731  written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.99999e-310);2732  ASSERT_STREQ_LEN(written, buff, "1e-309");2733 2734  written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.99999e-310);2735  ASSERT_STREQ_LEN(written, buff, "1e-309");2736 2737  written = LIBC_NAMESPACE::sprintf(buff, "%.10g", 0x1.0p-1074);2738  ASSERT_STREQ_LEN(written, buff, "4.940656458e-324");2739 2740  // Rounding Mode Tests.2741 2742  if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {2743    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2744    ASSERT_STREQ_LEN(written, buff, "1.8");2745 2746    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2747    ASSERT_STREQ_LEN(written, buff, "1.2");2748 2749    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2750    ASSERT_STREQ_LEN(written, buff, "1.1");2751 2752    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2753    ASSERT_STREQ_LEN(written, buff, "1.6");2754 2755    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2756    ASSERT_STREQ_LEN(written, buff, "1.4");2757 2758    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2759    ASSERT_STREQ_LEN(written, buff, "1.9");2760 2761    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2762    ASSERT_STREQ_LEN(written, buff, "-1.8");2763 2764    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2765    ASSERT_STREQ_LEN(written, buff, "-1.2");2766 2767    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2768    ASSERT_STREQ_LEN(written, buff, "-1.1");2769 2770    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2771    ASSERT_STREQ_LEN(written, buff, "-1.6");2772 2773    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2774    ASSERT_STREQ_LEN(written, buff, "-1.4");2775 2776    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2777    ASSERT_STREQ_LEN(written, buff, "-1.9");2778  }2779 2780  if (ForceRoundingMode r(RoundingMode::Upward); r.success) {2781    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2782    ASSERT_STREQ_LEN(written, buff, "1.8");2783 2784    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2785    ASSERT_STREQ_LEN(written, buff, "1.3");2786 2787    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2788    ASSERT_STREQ_LEN(written, buff, "1.2");2789 2790    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2791    ASSERT_STREQ_LEN(written, buff, "1.7");2792 2793    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2794    ASSERT_STREQ_LEN(written, buff, "1.4");2795 2796    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2797    ASSERT_STREQ_LEN(written, buff, "1.9");2798 2799    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2800    ASSERT_STREQ_LEN(written, buff, "-1.7");2801 2802    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2803    ASSERT_STREQ_LEN(written, buff, "-1.2");2804 2805    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2806    ASSERT_STREQ_LEN(written, buff, "-1.1");2807 2808    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2809    ASSERT_STREQ_LEN(written, buff, "-1.6");2810 2811    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2812    ASSERT_STREQ_LEN(written, buff, "-1.3");2813 2814    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2815    ASSERT_STREQ_LEN(written, buff, "-1.8");2816  }2817 2818  if (ForceRoundingMode r(RoundingMode::Downward); r.success) {2819    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2820    ASSERT_STREQ_LEN(written, buff, "1.7");2821 2822    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2823    ASSERT_STREQ_LEN(written, buff, "1.2");2824 2825    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2826    ASSERT_STREQ_LEN(written, buff, "1.1");2827 2828    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2829    ASSERT_STREQ_LEN(written, buff, "1.6");2830 2831    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2832    ASSERT_STREQ_LEN(written, buff, "1.3");2833 2834    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2835    ASSERT_STREQ_LEN(written, buff, "1.8");2836 2837    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2838    ASSERT_STREQ_LEN(written, buff, "-1.8");2839 2840    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2841    ASSERT_STREQ_LEN(written, buff, "-1.3");2842 2843    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2844    ASSERT_STREQ_LEN(written, buff, "-1.2");2845 2846    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2847    ASSERT_STREQ_LEN(written, buff, "-1.7");2848 2849    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2850    ASSERT_STREQ_LEN(written, buff, "-1.4");2851 2852    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2853    ASSERT_STREQ_LEN(written, buff, "-1.9");2854  }2855 2856  if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {2857    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);2858    ASSERT_STREQ_LEN(written, buff, "1.7");2859 2860    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);2861    ASSERT_STREQ_LEN(written, buff, "1.2");2862 2863    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);2864    ASSERT_STREQ_LEN(written, buff, "1.1");2865 2866    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);2867    ASSERT_STREQ_LEN(written, buff, "1.6");2868 2869    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);2870    ASSERT_STREQ_LEN(written, buff, "1.3");2871 2872    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);2873    ASSERT_STREQ_LEN(written, buff, "1.8");2874 2875    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);2876    ASSERT_STREQ_LEN(written, buff, "-1.7");2877 2878    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);2879    ASSERT_STREQ_LEN(written, buff, "-1.2");2880 2881    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);2882    ASSERT_STREQ_LEN(written, buff, "-1.1");2883 2884    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);2885    ASSERT_STREQ_LEN(written, buff, "-1.6");2886 2887    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);2888    ASSERT_STREQ_LEN(written, buff, "-1.3");2889 2890    written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);2891    ASSERT_STREQ_LEN(written, buff, "-1.8");2892  }2893 2894  // Flag Tests.2895  written = LIBC_NAMESPACE::sprintf(buff, "%+g", 1.0);2896  ASSERT_STREQ_LEN(written, buff, "+1");2897 2898  written = LIBC_NAMESPACE::sprintf(buff, "%+g", -1.0);2899  ASSERT_STREQ_LEN(written, buff, "-1");2900 2901  written = LIBC_NAMESPACE::sprintf(buff, "% g", 1.0);2902  ASSERT_STREQ_LEN(written, buff, " 1");2903 2904  written = LIBC_NAMESPACE::sprintf(buff, "% g", -1.0);2905  ASSERT_STREQ_LEN(written, buff, "-1");2906 2907  written = LIBC_NAMESPACE::sprintf(buff, "%-15g", 1.5);2908  ASSERT_STREQ_LEN(written, buff, "1.5            ");2909 2910  written = LIBC_NAMESPACE::sprintf(buff, "%#.g", 1.0);2911  ASSERT_STREQ_LEN(written, buff, "1.");2912 2913  written = LIBC_NAMESPACE::sprintf(buff, "%#g", 1.0);2914  ASSERT_STREQ_LEN(written, buff, "1.00000");2915 2916  written = LIBC_NAMESPACE::sprintf(buff, "%#.0g", 1.5);2917  ASSERT_STREQ_LEN(written, buff, "2.");2918 2919  written = LIBC_NAMESPACE::sprintf(buff, "%015g", 1.5);2920  ASSERT_STREQ_LEN(written, buff, "0000000000001.5");2921 2922  written = LIBC_NAMESPACE::sprintf(buff, "%015g", -1.5);2923  ASSERT_STREQ_LEN(written, buff, "-000000000001.5");2924 2925  written = LIBC_NAMESPACE::sprintf(buff, "%+- #0g", 0.0);2926  ASSERT_STREQ_LEN(written, buff, "+0.00000");2927 2928  // Combined Tests.2929 2930  written = LIBC_NAMESPACE::sprintf(buff, "%10.3g", 9.99);2931  ASSERT_STREQ_LEN(written, buff, "      9.99");2932 2933  written = LIBC_NAMESPACE::sprintf(buff, "%10.2g", 9.99);2934  ASSERT_STREQ_LEN(written, buff, "        10");2935 2936  written = LIBC_NAMESPACE::sprintf(buff, "%10.1g", 9.99);2937  ASSERT_STREQ_LEN(written, buff, "     1e+01");2938 2939  written = LIBC_NAMESPACE::sprintf(buff, "%-10.3g", 9.99);2940  ASSERT_STREQ_LEN(written, buff, "9.99      ");2941 2942  written = LIBC_NAMESPACE::sprintf(buff, "%-10.2g", 9.99);2943  ASSERT_STREQ_LEN(written, buff, "10        ");2944 2945  written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 9.99);2946  ASSERT_STREQ_LEN(written, buff, "1e+01     ");2947 2948  written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 1.0e-50);2949  ASSERT_STREQ_LEN(written, buff, "1e-50     ");2950 2951  written = LIBC_NAMESPACE::sprintf(buff, "%30g", 1234567890123456789.0);2952  ASSERT_STREQ_LEN(written, buff, "                   1.23457e+18");2953 2954  written = LIBC_NAMESPACE::sprintf(buff, "%-30g", 1234567890123456789.0);2955  ASSERT_STREQ_LEN(written, buff, "1.23457e+18                   ");2956 2957  written = LIBC_NAMESPACE::sprintf(buff, "%25.15g", 9999999999999.99);2958  ASSERT_STREQ_LEN(written, buff, "         9999999999999.99");2959 2960  written = LIBC_NAMESPACE::sprintf(buff, "%25.14g", 9999999999999.99);2961  ASSERT_STREQ_LEN(written, buff, "           10000000000000");2962 2963  written = LIBC_NAMESPACE::sprintf(buff, "%25.13g", 9999999999999.99);2964  ASSERT_STREQ_LEN(written, buff, "                    1e+13");2965 2966  written = LIBC_NAMESPACE::sprintf(buff, "%#12.3g %-12.3g", 0.1, 256.0);2967  ASSERT_STREQ_LEN(written, buff, "       0.100 256         ");2968 2969  written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3g % 012.3g", 0.1256, 1256.0);2970  ASSERT_STREQ_LEN(written, buff, "+0.126        0001.26e+03");2971}2972 2973TEST(LlvmLibcSPrintfTest, FloatAutoLongDoubleConv) {2974  char buff[1000];2975  int written;2976 2977  ForceRoundingMode r(RoundingMode::Nearest);2978 2979  // Length Modifier Tests.2980 2981// TODO: Tests for other long double types2982#if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)2983 2984  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xf.fffffffffffffffp+16380L);2985  ASSERT_STREQ_LEN(written, buff, "1.18973e+4932");2986 2987  // Minimum normal2988  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 3.36210314311209350626E-4932L);2989  ASSERT_STREQ_LEN(written, buff, "3.3621e-4932");2990 2991  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xa.aaaaaaaaaaaaaabp-7L);2992  ASSERT_STREQ_LEN(written, buff, "0.0833333");2993 2994#ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION2995  written = LIBC_NAMESPACE::sprintf(buff, "%.60Lg", 0xa.aaaaaaaaaaaaaabp-7L);2996  ASSERT_STREQ_LEN(2997      written, buff,2998      "0.0833333333333333333355920878593448009041821933351457118988037");2999#endif3000 3001#endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT803002 3003  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 9.99999999999e-100L);3004  ASSERT_STREQ_LEN(written, buff, "1e-99");3005 3006  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1e100L);3007  ASSERT_STREQ_LEN(written, buff, "1e+100");3008 3009  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1.0L);3010  ASSERT_STREQ_LEN(written, buff, "1");3011 3012  written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0.1L);3013  ASSERT_STREQ_LEN(written, buff, "0.1");3014 3015  char big_buff[10000];3016  written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e1000L);3017  ASSERT_STREQ_LEN(written, big_buff, "1e+1000");3018 3019  written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e4900L);3020  ASSERT_STREQ_LEN(written, big_buff, "1e+4900");3021}3022 3023#endif // LIBC_COPT_PRINTF_DISABLE_FLOAT3024 3025#if defined(LIBC_COMPILER_HAS_FIXED_POINT) &&                                  \3026    !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT)3027TEST(LlvmLibcSPrintfTest, FixedConv) {3028  char buff[1000];3029  int written;3030 3031  // These numeric tests are potentially a little weak, but the fuzz test is3032  // more thorough than my handwritten tests tend to be.3033 3034  // TODO: Replace hex literals with their appropriate fixed point literals.3035 3036  written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x0); // 0.03037  ASSERT_STREQ_LEN(written, buff, "0.000000");3038 3039  written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x80000000); // -0.03040  ASSERT_STREQ_LEN(written, buff, "-0.000000");3041 3042  written = LIBC_NAMESPACE::sprintf(buff, "%r", 0xffff); // -fract max3043  ASSERT_STREQ_LEN(written, buff, "-0.999969");3044 3045  written = LIBC_NAMESPACE::sprintf(buff, "%R", 0xffff); // unsigned fract max3046  ASSERT_STREQ_LEN(written, buff, "0.999985");3047 3048  written = LIBC_NAMESPACE::sprintf(buff, "%k", 0xffffffff); // -accum max3049  ASSERT_STREQ_LEN(written, buff, "-65535.999969");3050 3051  written =3052      LIBC_NAMESPACE::sprintf(buff, "%K", 0xffffffff); // unsigned accum max3053  ASSERT_STREQ_LEN(written, buff, "65535.999985");3054 3055  written = LIBC_NAMESPACE::sprintf(buff, "%r", 0x7fff); // fract max3056  ASSERT_STREQ_LEN(written, buff, "0.999969");3057 3058  written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x7fffffff); // accum max3059  ASSERT_STREQ_LEN(written, buff, "65535.999969");3060 3061  // Length Modifier Tests.3062 3063  written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0x0); // 0.03064  ASSERT_STREQ_LEN(written, buff, "0.000000");3065 3066  written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0xffff); // -short accum max3067  ASSERT_STREQ_LEN(written, buff, "-255.992188");3068 3069  written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0x0); // 0.03070  ASSERT_STREQ_LEN(written, buff, "0.000000");3071 3072  written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0xff); // -short fract max3073  ASSERT_STREQ_LEN(written, buff, "-0.992188");3074 3075  written = LIBC_NAMESPACE::sprintf(buff, "%hK", 0x0); // 0.03076  ASSERT_STREQ_LEN(written, buff, "0.000000");3077 3078  written =3079      LIBC_NAMESPACE::sprintf(buff, "%hK", 0xffff); // unsigned short accum max3080  ASSERT_STREQ_LEN(written, buff, "255.996094");3081 3082  written = LIBC_NAMESPACE::sprintf(buff, "%hR", 0x0); // 0.03083  ASSERT_STREQ_LEN(written, buff, "0.000000");3084 3085  written =3086      LIBC_NAMESPACE::sprintf(buff, "%hR", 0xff); // unsigned short fract max3087  ASSERT_STREQ_LEN(written, buff, "0.996094");3088 3089  written = LIBC_NAMESPACE::sprintf(buff, "%lk", 0x0ll); // 0.03090  ASSERT_STREQ_LEN(written, buff, "0.000000");3091 3092  written = LIBC_NAMESPACE::sprintf(buff, "%lk",3093                                    0xffffffffffffffff); //-long accum max3094  ASSERT_STREQ_LEN(written, buff, "-4294967296.000000");3095 3096  written = LIBC_NAMESPACE::sprintf(buff, "%lr", 0x0); // 0.03097  ASSERT_STREQ_LEN(written, buff, "0.000000");3098 3099  written = LIBC_NAMESPACE::sprintf(buff, "%lr",3100                                    0xffffffff); //-long fract max3101  ASSERT_STREQ_LEN(written, buff, "-1.000000");3102 3103  written = LIBC_NAMESPACE::sprintf(buff, "%lK", 0x0ll); // 0.03104  ASSERT_STREQ_LEN(written, buff, "0.000000");3105 3106  written =3107      LIBC_NAMESPACE::sprintf(buff, "%lK",3108                              0xffffffffffffffff); // unsigned long accum max3109  ASSERT_STREQ_LEN(written, buff, "4294967296.000000");3110 3111  written = LIBC_NAMESPACE::sprintf(buff, "%lR", 0x0); // 0.03112  ASSERT_STREQ_LEN(written, buff, "0.000000");3113 3114  written = LIBC_NAMESPACE::sprintf(buff, "%lR",3115                                    0xffffffff); // unsigned long fract max3116  ASSERT_STREQ_LEN(written, buff, "1.000000");3117 3118  // Min Width Tests.3119 3120  written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x0000a000); // 1.253121  ASSERT_STREQ_LEN(written, buff, "  1.250000");3122 3123  written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x8000a000); //-1.253124  ASSERT_STREQ_LEN(written, buff, " -1.250000");3125 3126  written = LIBC_NAMESPACE::sprintf(buff, "%8k", 0x0000a000); // 1.253127  ASSERT_STREQ_LEN(written, buff, "1.250000");3128 3129  written = LIBC_NAMESPACE::sprintf(buff, "%9k", 0x8000a000); //-1.253130  ASSERT_STREQ_LEN(written, buff, "-1.250000");3131 3132  written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x0000a000); // 1.253133  ASSERT_STREQ_LEN(written, buff, "1.250000");3134 3135  written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x8000a000); //-1.253136  ASSERT_STREQ_LEN(written, buff, "-1.250000");3137 3138  // Precision Tests.3139 3140  written =3141      LIBC_NAMESPACE::sprintf(buff, "%.16K", 0xFFFFFFFF); // unsigned accum max3142  ASSERT_STREQ_LEN(written, buff, "65535.9999847412109375");3143 3144  written = LIBC_NAMESPACE::sprintf(3145      buff, "%.32lK", 0xFFFFFFFFFFFFFFFF); // unsigned long accum max3146  ASSERT_STREQ_LEN(written, buff,3147                   "4294967295.99999999976716935634613037109375");3148 3149  written =3150      LIBC_NAMESPACE::sprintf(buff, "%.0K", 0xFFFFFFFF); // unsigned accum max3151  ASSERT_STREQ_LEN(written, buff, "65536");3152 3153  written = LIBC_NAMESPACE::sprintf(buff, "%.0R", 0xFFFF); // unsigned fract max3154  ASSERT_STREQ_LEN(written, buff, "1");3155 3156  // Flag Tests.3157 3158  written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x0000a000); // 1.253159  ASSERT_STREQ_LEN(written, buff, "+1.250000");3160 3161  written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x8000a000); //-1.253162  ASSERT_STREQ_LEN(written, buff, "-1.250000");3163 3164  written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x0000a000); // 1.253165  ASSERT_STREQ_LEN(written, buff, " 1.250000");3166 3167  written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x8000a000); //-1.253168  ASSERT_STREQ_LEN(written, buff, "-1.250000");3169 3170  // unsigned variants ignore sign flags.3171  written = LIBC_NAMESPACE::sprintf(buff, "%+K", 0x00014000); // 1.253172  ASSERT_STREQ_LEN(written, buff, "1.250000");3173 3174  written = LIBC_NAMESPACE::sprintf(buff, "% K", 0x00014000); // 1.253175  ASSERT_STREQ_LEN(written, buff, "1.250000");3176 3177  written = LIBC_NAMESPACE::sprintf(buff, "%-10k", 0x0000c000); // 1.53178  ASSERT_STREQ_LEN(written, buff, "1.500000  ");3179 3180  written = LIBC_NAMESPACE::sprintf(buff, "%#.k", 0x00008000); // 1.03181  ASSERT_STREQ_LEN(written, buff, "1.");3182 3183  written = LIBC_NAMESPACE::sprintf(buff, "%#.0k", 0x0000c000); // 1.53184  ASSERT_STREQ_LEN(written, buff, "2.");3185 3186  written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x0000c000); // 1.53187  ASSERT_STREQ_LEN(written, buff, "001.500000");3188 3189  written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x8000c000); //-1.53190  ASSERT_STREQ_LEN(written, buff, "-01.500000");3191 3192  written = LIBC_NAMESPACE::sprintf(buff, "%+- #0k", 0); // 0.03193  ASSERT_STREQ_LEN(written, buff, "+0.000000");3194 3195  // Combined Tests.3196 3197  written = LIBC_NAMESPACE::sprintf(buff, "%10.2k", 0x0004feb8); // 9.993198  ASSERT_STREQ_LEN(written, buff, "      9.99");3199 3200  written = LIBC_NAMESPACE::sprintf(buff, "%5.1k", 0x0004feb8); // 9.993201  ASSERT_STREQ_LEN(written, buff, " 10.0");3202 3203  written = LIBC_NAMESPACE::sprintf(buff, "%-10.2k", 0x0004feb8); // 9.993204  ASSERT_STREQ_LEN(written, buff, "9.99      ");3205 3206  written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x0004feb8); // 9.993207  ASSERT_STREQ_LEN(written, buff, "10.0 ");3208 3209  written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x00000001); // accum min3210  ASSERT_STREQ_LEN(written, buff, "0.0  ");3211 3212  written = LIBC_NAMESPACE::sprintf(buff, "%30k", 0x7fffffff); // accum max3213  ASSERT_STREQ_LEN(written, buff, "                  65535.999969");3214 3215  written = LIBC_NAMESPACE::sprintf(buff, "%-30k", 0x7fffffff); // accum max3216  ASSERT_STREQ_LEN(written, buff, "65535.999969                  ");3217 3218  written = LIBC_NAMESPACE::sprintf(buff, "%20.2lK",3219                                    0x3b9ac9ffFD70A3D7); // 999999999.993220  ASSERT_STREQ_LEN(written, buff, "        999999999.99");3221 3222  written = LIBC_NAMESPACE::sprintf(buff, "%20.1lK",3223                                    0x3b9ac9ffFD70A3D7); // 999999999.993224  ASSERT_STREQ_LEN(written, buff, "        1000000000.0");3225 3226  written = LIBC_NAMESPACE::sprintf(buff, "%12.3R %-12.3k", 0x1999,3227                                    0x00800000); // 0.1, 256.03228  ASSERT_STREQ_LEN(written, buff, "       0.100 256.000     ");3229 3230  written =3231      LIBC_NAMESPACE::sprintf(buff, "%+-#12.3lk % 012.3k", 0x000000001013a92all,3232                              0x02740000); // 0.126, 1256.03233  ASSERT_STREQ_LEN(written, buff, "+0.126        0001256.000");3234}3235#endif // defined(LIBC_COMPILER_HAS_FIXED_POINT) &&3236       // !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT)3237 3238#ifndef LIBC_COPT_PRINTF_DISABLE_STRERROR3239TEST(LlvmLibcSPrintfTest, StrerrorConv) {3240  char buff[1000];3241  int written;3242 3243  libc_errno = 0;3244  written = LIBC_NAMESPACE::sprintf(buff, "%m");3245  ASSERT_STREQ_LEN(written, buff, "Success");3246 3247  libc_errno = ERANGE;3248  written = LIBC_NAMESPACE::sprintf(buff, "%m");3249  ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");3250 3251  // Check that it correctly consumes no arguments.3252  libc_errno = 0;3253  written = LIBC_NAMESPACE::sprintf(buff, "%m %d", 1);3254  ASSERT_STREQ_LEN(written, buff, "Success 1");3255 3256  // Width Tests3257 3258  libc_errno = 0;3259  written = LIBC_NAMESPACE::sprintf(buff, "%10m");3260  ASSERT_STREQ_LEN(written, buff, "   Success");3261 3262  libc_errno = ERANGE;3263  written = LIBC_NAMESPACE::sprintf(buff, "%10m");3264  ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");3265 3266  // Precision Tests3267 3268  libc_errno = 0;3269  written = LIBC_NAMESPACE::sprintf(buff, "%.10m");3270  ASSERT_STREQ_LEN(written, buff, "Success");3271 3272  libc_errno = ERANGE;3273  written = LIBC_NAMESPACE::sprintf(buff, "%.10m");3274  ASSERT_STREQ_LEN(written, buff, "Numerical ");3275 3276  // Flag Tests (Only '-' since the others only affect ints)3277 3278  libc_errno = 0;3279  written = LIBC_NAMESPACE::sprintf(buff, "%-10m");3280  ASSERT_STREQ_LEN(written, buff, "Success   ");3281 3282  libc_errno = ERANGE;3283  written = LIBC_NAMESPACE::sprintf(buff, "%-10m");3284  ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");3285 3286  // Alt Mode Tests3287  // Since alt mode here is effectively a completely separate conversion, it3288  // gets separate tests.3289 3290  libc_errno = 0;3291  written = LIBC_NAMESPACE::sprintf(buff, "%#m");3292  ASSERT_STREQ_LEN(written, buff, "0");3293 3294  libc_errno = ERANGE;3295  written = LIBC_NAMESPACE::sprintf(buff, "%#m");3296  ASSERT_STREQ_LEN(written, buff, "ERANGE");3297 3298  libc_errno = -9999;3299  written = LIBC_NAMESPACE::sprintf(buff, "%#m");3300  ASSERT_STREQ_LEN(written, buff, "-9999");3301 3302  // Alt Mode Width3303 3304  libc_errno = 0;3305  written = LIBC_NAMESPACE::sprintf(buff, "%#10m");3306  ASSERT_STREQ_LEN(written, buff, "         0");3307 3308  libc_errno = ERANGE;3309  written = LIBC_NAMESPACE::sprintf(buff, "%#10m");3310  ASSERT_STREQ_LEN(written, buff, "    ERANGE");3311 3312  libc_errno = -9999;3313  written = LIBC_NAMESPACE::sprintf(buff, "%#10m");3314  ASSERT_STREQ_LEN(written, buff, "     -9999");3315 3316  libc_errno = ERANGE;3317  written = LIBC_NAMESPACE::sprintf(buff, "%#3m");3318  ASSERT_STREQ_LEN(written, buff, "ERANGE");3319 3320  libc_errno = -9999;3321  written = LIBC_NAMESPACE::sprintf(buff, "%#3m");3322  ASSERT_STREQ_LEN(written, buff, "-9999");3323 3324  // Alt Mode Precision3325 3326  libc_errno = ERANGE;3327  written = LIBC_NAMESPACE::sprintf(buff, "%#.10m");3328  ASSERT_STREQ_LEN(written, buff, "ERANGE");3329 3330  libc_errno = -9999;3331  written = LIBC_NAMESPACE::sprintf(buff, "%#.10m");3332  ASSERT_STREQ_LEN(written, buff, "-0000009999");3333 3334  libc_errno = ERANGE;3335  written = LIBC_NAMESPACE::sprintf(buff, "%#.3m");3336  ASSERT_STREQ_LEN(written, buff, "ERA");3337 3338  libc_errno = -9999;3339  written = LIBC_NAMESPACE::sprintf(buff, "%#.3m");3340  ASSERT_STREQ_LEN(written, buff, "-9999");3341 3342  // We don't test precision (or int flags) on errno = 0 because it behaves3343  // weirdly, see the docs for more information.3344  libc_errno = 0;3345  written = LIBC_NAMESPACE::sprintf(buff, "%#.1m");3346  ASSERT_STREQ_LEN(written, buff, "0");3347 3348  // Alt Mode Flags3349 3350  // '-' flag3351  libc_errno = 0;3352  written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");3353  ASSERT_STREQ_LEN(written, buff, "0         ");3354 3355  libc_errno = ERANGE;3356  written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");3357  ASSERT_STREQ_LEN(written, buff, "ERANGE    ");3358 3359  libc_errno = -9999;3360  written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");3361  ASSERT_STREQ_LEN(written, buff, "-9999     ");3362 3363  libc_errno = ERANGE;3364  written = LIBC_NAMESPACE::sprintf(buff, "%#-3m");3365  ASSERT_STREQ_LEN(written, buff, "ERANGE");3366 3367  libc_errno = -9999;3368  written = LIBC_NAMESPACE::sprintf(buff, "%#-3m");3369  ASSERT_STREQ_LEN(written, buff, "-9999");3370 3371  // '+' flag3372  libc_errno = ERANGE;3373  written = LIBC_NAMESPACE::sprintf(buff, "%#+m");3374  ASSERT_STREQ_LEN(written, buff, "ERANGE");3375 3376  libc_errno = -9999;3377  written = LIBC_NAMESPACE::sprintf(buff, "%#+m");3378  ASSERT_STREQ_LEN(written, buff, "-9999");3379 3380  // Technically 9999 could be a valid error, since the standard just says errno3381  // macros are "distinct positive values". In practice I don't expect this to3382  // come up, but I've avoided it for the other %m tests for ease of3383  // refactoring if necessary. Here it needs to be positive to test that the3384  // flags that only affect positive signed integers are properly passed along.3385  libc_errno = 9999;3386  written = LIBC_NAMESPACE::sprintf(buff, "%#+m");3387  ASSERT_STREQ_LEN(written, buff, "+9999");3388 3389  // ' ' flag3390  libc_errno = ERANGE;3391  written = LIBC_NAMESPACE::sprintf(buff, "%# m");3392  ASSERT_STREQ_LEN(written, buff, "ERANGE");3393 3394  libc_errno = -9999;3395  written = LIBC_NAMESPACE::sprintf(buff, "%# m");3396  ASSERT_STREQ_LEN(written, buff, "-9999");3397 3398  libc_errno = 9999;3399  written = LIBC_NAMESPACE::sprintf(buff, "%# m");3400  ASSERT_STREQ_LEN(written, buff, " 9999");3401 3402  // '0' flag3403 3404  libc_errno = ERANGE;3405  written = LIBC_NAMESPACE::sprintf(buff, "%#010m");3406  ASSERT_STREQ_LEN(written, buff, "    ERANGE");3407 3408  libc_errno = -9999;3409  written = LIBC_NAMESPACE::sprintf(buff, "%#010m");3410  ASSERT_STREQ_LEN(written, buff, "-000009999");3411 3412  libc_errno = ERANGE;3413  written = LIBC_NAMESPACE::sprintf(buff, "%#03m");3414  ASSERT_STREQ_LEN(written, buff, "ERANGE");3415 3416  libc_errno = -9999;3417  written = LIBC_NAMESPACE::sprintf(buff, "%#03m");3418  ASSERT_STREQ_LEN(written, buff, "-9999");3419}3420#endif // LIBC_COPT_PRINTF_DISABLE_STRERROR3421 3422#ifndef LIBC_COPT_PRINTF_DISABLE_WRITE_INT3423TEST(LlvmLibcSPrintfTest, WriteIntConv) {3424  char buff[64];3425  int written;3426  int test_val = -1;3427 3428  test_val = -1;3429  written = LIBC_NAMESPACE::sprintf(buff, "12345%n67890", &test_val);3430  EXPECT_EQ(test_val, 5);3431  ASSERT_STREQ_LEN(written, buff, "1234567890");3432 3433  test_val = -1;3434  written = LIBC_NAMESPACE::sprintf(buff, "%n", &test_val);3435  EXPECT_EQ(test_val, 0);3436  ASSERT_STREQ_LEN(written, buff, "");3437 3438  test_val = 0x100;3439  written = LIBC_NAMESPACE::sprintf(buff, "ABC%hhnDEF", &test_val);3440  EXPECT_EQ(test_val, 0x103);3441  ASSERT_STREQ_LEN(written, buff, "ABCDEF");3442 3443  test_val = -1;3444  written = LIBC_NAMESPACE::sprintf(buff, "%s%n", "87654321", &test_val);3445  EXPECT_EQ(test_val, 8);3446  ASSERT_STREQ_LEN(written, buff, "87654321");3447 3448#ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS3449  written = LIBC_NAMESPACE::sprintf(buff, "abc123%n", nullptr);3450  EXPECT_LT(written, 0);3451#endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS3452}3453#endif // LIBC_COPT_PRINTF_DISABLE_WRITE_INT3454 3455#ifndef LIBC_COPT_PRINTF_DISABLE_INDEX_MODE3456TEST(LlvmLibcSPrintfTest, IndexModeParsing) {3457  char buff[64];3458  int written;3459 3460  written = LIBC_NAMESPACE::sprintf(buff, "%1$s", "abcDEF123");3461  ASSERT_STREQ_LEN(written, buff, "abcDEF123");3462 3463  written = LIBC_NAMESPACE::sprintf(buff, "%1$s %%", "abcDEF123");3464  ASSERT_STREQ_LEN(written, buff, "abcDEF123 %");3465 3466  written =3467      LIBC_NAMESPACE::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering");3468  ASSERT_STREQ_LEN(written, buff, "ordering is hard");3469 3470  written = LIBC_NAMESPACE::sprintf(3471      buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%",3472      6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would",3473      "why", 1);3474  ASSERT_STREQ_LEN(written, buff,3475                   "why would u do this, this is such   a pain. %");3476}3477#endif // LIBC_COPT_PRINTF_DISABLE_INDEX_MODE3478