@@ -362,6 +362,127 @@ TEST(LlvmLibcSPrintfTest, PointerConv) {
362362 EXPECT_GT (written, 0 );
363363}
364364
365+ TEST (LlvmLibcSPrintfTest, OctConv) {
366+ char buff[64 ];
367+ int written;
368+
369+ // Basic Tests.
370+
371+ written = __llvm_libc::sprintf (buff, " %o" , 01234 );
372+ EXPECT_EQ (written, 4 );
373+ ASSERT_STREQ (buff, " 1234" );
374+
375+ written = __llvm_libc::sprintf (buff, " %o" , 04567 );
376+ EXPECT_EQ (written, 4 );
377+ ASSERT_STREQ (buff, " 4567" );
378+
379+ // Length Modifier Tests.
380+
381+ written = __llvm_libc::sprintf (buff, " %hho" , 0401 );
382+ EXPECT_EQ (written, 1 );
383+ ASSERT_STREQ (buff, " 1" );
384+
385+ written = __llvm_libc::sprintf (buff, " %llo" , 01777777777777777777777ull );
386+ EXPECT_EQ (written, 22 );
387+ ASSERT_STREQ (buff, " 1777777777777777777777" ); // ull max
388+
389+ written = __llvm_libc::sprintf (buff, " %to" , ~ptrdiff_t (0 ));
390+ if (sizeof (ptrdiff_t ) == 8 ) {
391+ EXPECT_EQ (written, 22 );
392+ ASSERT_STREQ (buff, " 1777777777777777777777" );
393+ } else if (sizeof (ptrdiff_t ) == 4 ) {
394+ EXPECT_EQ (written, 11 );
395+ ASSERT_STREQ (buff, " 37777777777" );
396+ }
397+
398+ // Min Width Tests.
399+
400+ written = __llvm_libc::sprintf (buff, " %4o" , 0701 );
401+ EXPECT_EQ (written, 4 );
402+ ASSERT_STREQ (buff, " 701" );
403+
404+ written = __llvm_libc::sprintf (buff, " %2o" , 0107 );
405+ EXPECT_EQ (written, 3 );
406+ ASSERT_STREQ (buff, " 107" );
407+
408+ // Precision Tests.
409+
410+ written = __llvm_libc::sprintf (buff, " %o" , 0 );
411+ EXPECT_EQ (written, 1 );
412+ ASSERT_STREQ (buff, " 0" );
413+
414+ written = __llvm_libc::sprintf (buff, " %.0o" , 0 );
415+ EXPECT_EQ (written, 0 );
416+ ASSERT_STREQ (buff, " " );
417+
418+ written = __llvm_libc::sprintf (buff, " %.5o" , 0153 );
419+ EXPECT_EQ (written, 5 );
420+ ASSERT_STREQ (buff, " 00153" );
421+
422+ written = __llvm_libc::sprintf (buff, " %.2o" , 0135 );
423+ EXPECT_EQ (written, 3 );
424+ ASSERT_STREQ (buff, " 135" );
425+
426+ // Flag Tests.
427+
428+ written = __llvm_libc::sprintf (buff, " %-5o" , 0246 );
429+ EXPECT_EQ (written, 5 );
430+ ASSERT_STREQ (buff, " 246 " );
431+
432+ written = __llvm_libc::sprintf (buff, " %#o" , 0234 );
433+ EXPECT_EQ (written, 4 );
434+ ASSERT_STREQ (buff, " 0234" );
435+
436+ written = __llvm_libc::sprintf (buff, " %05o" , 0470 );
437+ EXPECT_EQ (written, 5 );
438+ ASSERT_STREQ (buff, " 00470" );
439+
440+ written = __llvm_libc::sprintf (buff, " %0#6o" , 0753 );
441+ EXPECT_EQ (written, 6 );
442+ ASSERT_STREQ (buff, " 000753" );
443+
444+ written = __llvm_libc::sprintf (buff, " %-#6o" , 0642 );
445+ EXPECT_EQ (written, 6 );
446+ ASSERT_STREQ (buff, " 0642 " );
447+
448+ // Combined Tests.
449+
450+ written = __llvm_libc::sprintf (buff, " %#-07o" , 0703 );
451+ EXPECT_EQ (written, 7 );
452+ ASSERT_STREQ (buff, " 0703 " );
453+
454+ written = __llvm_libc::sprintf (buff, " %7.5o" , 0314 );
455+ EXPECT_EQ (written, 7 );
456+ ASSERT_STREQ (buff, " 00314" );
457+
458+ written = __llvm_libc::sprintf (buff, " %#9.5o" , 0234 );
459+ EXPECT_EQ (written, 9 );
460+ ASSERT_STREQ (buff, " 00234" );
461+
462+ written = __llvm_libc::sprintf (buff, " %-7.5o" , 0260 );
463+ EXPECT_EQ (written, 7 );
464+ ASSERT_STREQ (buff, " 00260 " );
465+
466+ written = __llvm_libc::sprintf (buff, " %5.4o" , 010000 );
467+ EXPECT_EQ (written, 5 );
468+ ASSERT_STREQ (buff, " 10000" );
469+
470+ // Multiple Conversion Tests.
471+
472+ written = __llvm_libc::sprintf (buff, " %10o %-#10o" , 0456 , 0123 );
473+ EXPECT_EQ (written, 21 );
474+ ASSERT_STREQ (buff, " 456 0123 " );
475+
476+ written = __llvm_libc::sprintf (buff, " %-5.4o%#.4o" , 075 , 025 );
477+ EXPECT_EQ (written, 9 );
478+ ASSERT_STREQ (buff, " 0075 0025" );
479+
480+ written = __llvm_libc::sprintf (buff, " %04hho %#.5llo %-6.3zo" , 256 + 077 ,
481+ 01000000000000ll , size_t (2 ));
482+ EXPECT_EQ (written, 26 );
483+ ASSERT_STREQ (buff, " 0077 01000000000000 002 " );
484+ }
485+
365486#ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
366487TEST (LlvmLibcSPrintfTest, IndexModeParsing) {
367488 char buff[64 ];
0 commit comments