@@ -271,11 +271,7 @@ fn formatValue(
271
271
const T = @typeOf (value );
272
272
switch (@typeId (T )) {
273
273
builtin .TypeId .Float = > return formatFloatValue (value , fmt , context , Errors , output ),
274
- builtin .TypeId .Int = > return formatIntValue (value , fmt , context , Errors , output ),
275
- builtin .TypeId .ComptimeInt = > {
276
- const Int = math .IntFittingRange (value , value );
277
- return formatIntValue (Int (value ), fmt , context , Errors , output );
278
- },
274
+ builtin .TypeId .Int , builtin .TypeId .ComptimeInt = > return formatIntValue (value , fmt , context , Errors , output ),
279
275
else = > comptime unreachable ,
280
276
}
281
277
}
@@ -290,13 +286,20 @@ pub fn formatIntValue(
290
286
comptime var radix = 10 ;
291
287
comptime var uppercase = false ;
292
288
comptime var width = 0 ;
289
+
290
+ const int_value = if (@typeOf (value ) == comptime_int ) blk : {
291
+ const Int = math .IntFittingRange (value , value );
292
+ break :blk Int (value );
293
+ } else
294
+ value ;
295
+
293
296
if (fmt .len > 0 ) {
294
297
switch (fmt [0 ]) {
295
298
'c' = > {
296
- if (@typeOf (value ).bit_count <= 8 ) {
299
+ if (@typeOf (int_value ).bit_count <= 8 ) {
297
300
if (fmt .len > 1 )
298
301
@compileError ("Unknown format character: " ++ []u8 {fmt [1 ]});
299
- return formatAsciiChar (u8 (value ), context , Errors , output );
302
+ return formatAsciiChar (u8 (int_value ), context , Errors , output );
300
303
}
301
304
},
302
305
'b' = > {
@@ -323,7 +326,7 @@ pub fn formatIntValue(
323
326
}
324
327
if (fmt .len > 1 ) width = comptime (parseUnsigned (usize , fmt [1.. ], 10 ) catch unreachable );
325
328
}
326
- return formatInt (value , radix , uppercase , width , context , Errors , output );
329
+ return formatInt (int_value , radix , uppercase , width , context , Errors , output );
327
330
}
328
331
329
332
fn formatFloatValue (
@@ -686,10 +689,16 @@ pub fn formatInt(
686
689
comptime Errors : type ,
687
690
output : fn (@typeOf (context ), []const u8 ) Errors ! void ,
688
691
) Errors ! void {
689
- if (@typeOf (value ).is_signed ) {
690
- return formatIntSigned (value , base , uppercase , width , context , Errors , output );
692
+ const int_value = if (@typeOf (value ) == comptime_int ) blk : {
693
+ const Int = math .IntFittingRange (value , value );
694
+ break :blk Int (value );
695
+ } else
696
+ value ;
697
+
698
+ if (@typeOf (int_value ).is_signed ) {
699
+ return formatIntSigned (int_value , base , uppercase , width , context , Errors , output );
691
700
} else {
692
- return formatIntUnsigned (value , base , uppercase , width , context , Errors , output );
701
+ return formatIntUnsigned (int_value , base , uppercase , width , context , Errors , output );
693
702
}
694
703
}
695
704
@@ -1432,3 +1441,11 @@ test "fmt.hexToBytes" {
1432
1441
try hexToBytes (pb [0.. ], test_hex_str );
1433
1442
try testFmt (test_hex_str , "{X}" , pb );
1434
1443
}
1444
+
1445
+ test "fmt.formatIntValue with comptime_int" {
1446
+ const value : comptime_int = 123456789123456789 ;
1447
+
1448
+ var buf = try std .Buffer .init (std .debug .global_allocator , "" );
1449
+ try formatIntValue (value , "" , & buf , @typeOf (std .Buffer .append ).ReturnType .ErrorSet , std .Buffer .append );
1450
+ assert (mem .eql (u8 , buf .toSlice (), "123456789123456789" ));
1451
+ }
0 commit comments