I'm not sure if this is a bug or not.
I tried this code:
use std::fmt::{self, Display, Formatter};
use std::cell::Cell;
struct PrintCounter(Cell<usize>);
impl Display for PrintCounter {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let counter = 1 + self.0.get();
self.0.set(counter);
write!(f, "{counter}")
}
}
const ZERO: PrintCounter = PrintCounter(Cell::new(0));
fn main() {
println!("{ZERO}, {ZERO}");
}
I expected the code to print 1, 1, since I am creating two separate PrintCounter values and printing them separately.
Instead, it printed 1, 2. The compiler seemed to have deduplicated the two mentions of ZERO into one mention.
Note that if the code is modified to be println!("{}, {}", ZERO, ZERO);, then it correctly prints 1, 1.
@rustbot labels +A-fmt
Meta
Reproducible on the playground with version 1.91.0-nightly (2025-08-20 040a98af70f0a7da03f3)
Related
I'm not sure if this is a bug or not.
I tried this code:
I expected the code to print
1, 1, since I am creating two separatePrintCountervalues and printing them separately.Instead, it printed
1, 2. The compiler seemed to have deduplicated the two mentions ofZEROinto one mention.Note that if the code is modified to be
println!("{}, {}", ZERO, ZERO);, then it correctly prints1, 1.@rustbot labels +A-fmt
Meta
Reproducible on the playground with version
1.91.0-nightly (2025-08-20 040a98af70f0a7da03f3)Related
format_args!#149926