diff --git a/src/expr.rs b/src/expr.rs index 509f790842f..826897a2b26 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -504,6 +504,9 @@ fn nop_block_collapse(block_str: Option, budget: usize) -> Option Option { + // width is used only for the single line case: either the empty block `{}`, + // or an unsafe expression `unsafe { e }`. + let user_str = context.snippet(self.span); if user_str == "{}" && width >= 2 { return Some(user_str); @@ -674,9 +677,15 @@ impl<'a> Rewrite for Loop<'a> { ControlBraceStyle::AlwaysNextLine => alt_block_sep.as_str(), ControlBraceStyle::AlwaysSameLine => " ", }; + + // This is used only for the empty block case: `{}` + let block_width = try_opt!(width.checked_sub(label_string.len() + self.keyword.len() + + extra_offset(&pat_expr_string, inner_offset) + + 1)); + // FIXME: this drops any comment between "loop" and the block. self.block - .rewrite(context, width, offset) + .rewrite(context, block_width, offset) .map(|result| { format!("{}{}{}{}{}", label_string, diff --git a/tests/source/loop.rs b/tests/source/loop.rs index c7f7da71831..e1266197a1c 100644 --- a/tests/source/loop.rs +++ b/tests/source/loop.rs @@ -14,6 +14,8 @@ let x = loop { do_forever(); }; while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa > bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb { } + while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {} + 'b: for xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx in some_iter(arg1, arg2) { // do smth } diff --git a/tests/target/loop.rs b/tests/target/loop.rs index 648fe826e8f..ea84c00c22b 100644 --- a/tests/target/loop.rs +++ b/tests/target/loop.rs @@ -18,6 +18,9 @@ fn main() { while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa > bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb { } + while aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa { + } + 'b: for xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx in some_iter(arg1, arg2) { // do smth