Skip to content

Commit 7b862a5

Browse files
committed
core: Fix handling of 0-padded floats with precision in #fmt
1 parent 630c084 commit 7b862a5

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

src/libcore/extfmt.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ mod rt {
339339
s = " " + s;
340340
}
341341
}
342-
ret pad(cv, s, pad_signed);
342+
ret pad(cv, s, pad_float);
343343
}
344344
fn conv_poly<T>(cv: conv, v: T) -> str {
345345
let s = sys::log_str(v);
@@ -376,7 +376,7 @@ mod rt {
376376
count_implied { 1u }
377377
};
378378
}
379-
enum pad_mode { pad_signed, pad_unsigned, pad_nozero, }
379+
enum pad_mode { pad_signed, pad_unsigned, pad_nozero, pad_float }
380380
fn pad(cv: conv, &s: str, mode: pad_mode) -> str unsafe {
381381
let uwidth : uint = alt cv.width {
382382
count_implied { ret s; }
@@ -396,14 +396,15 @@ mod rt {
396396
let {might_zero_pad, signed} = alt mode {
397397
pad_nozero { {might_zero_pad:false, signed:false} }
398398
pad_signed { {might_zero_pad:true, signed:true } }
399+
pad_float { {might_zero_pad:true, signed:true } }
399400
pad_unsigned { {might_zero_pad:true, signed:false} }
400401
};
401402
fn have_precision(cv: conv) -> bool {
402403
ret alt cv.precision { count_implied { false } _ { true } };
403404
}
404405
let zero_padding = {
405406
if might_zero_pad && have_flag(cv.flags, flag_left_zero_pad) &&
406-
!have_precision(cv) {
407+
(!have_precision(cv) || mode == pad_float) {
407408
padchar = '0';
408409
true
409410
} else {

src/test/run-pass/syntax-extension-fmt.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ fn part5() {
199199
}
200200
fn part6() {
201201
// Precision overrides 0-padding
202+
// FIXME #2481: Recent gcc's report some of these as warnings
202203

203204
test(#fmt["%06.5d", 0], " 00000");
204205
test(#fmt["%06.5u", 0u], " 00000");
@@ -211,7 +212,10 @@ fn part6() {
211212
test(#fmt["%06.5x", 127u], " 0007f");
212213
test(#fmt["%06.5X", 127u], " 0007F");
213214
test(#fmt["%06.5o", 10u], " 00012");
214-
test(#fmt["%08.5f", 5.82], " 5.82000");
215+
216+
// Precision does not override zero-padding for floats
217+
test(#fmt["%08.5f", 5.82], "05.82000");
218+
215219
// Signed combinations
216220

217221
test(#fmt["% 5d", 1], " 1");

0 commit comments

Comments
 (0)