Skip to content

wrap_comments partially ignores comment_width with bullet lists #6801

@cyphar

Description

@cyphar

In some fairly specific circumstances, rustfmt with wrap_comments=true will allow comments to wrap a few characters beyond the configured comment_width. So far I have managed to only hit this a few times with bullet points in comments of the following form (these examples were hard-wrapped manually by me and are all within 80 columns -- I would expect rustfmt to do nothing as as result):

// * aaa Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
//   aaq tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
//   aaa veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
//   aaa commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
//   aaa velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
//   aaa occaecat cupidatat non proident, sunt in culpa qui officia deserunt
//   aaa mollit anim id est laborum.

fn bad_comment() {
    // * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
    //   tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
    //   veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
    //   commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
    //   velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
    //   occaecat cupidatat non proident, sunt in culpa qui officia deserunt
    //   mollit anim id est laborum.

    ()
}

fn comment_ignored() {
    foobar();

    // * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
    //   tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
    //   veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
    //   commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
    //   velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
    //   occaecat cupidatat non proident, sunt in culpa qui officia deserunt
    //   mollit anim id est laborum.
}

If you then try to use rustfmt you will see that it suggests wrappings that exceed 80 characters for a few lines where the continuing word is short. Note that it seems there must be something after the comment for comments in functions -- comment_ignored is accepted by rustfmt despite having identical comment text to bad_comment.

% rustc +nightly --version
rustc 1.95.0-nightly (7057231bd 2026-02-11)
% rustfmt +nightly --version
rustfmt 1.8.0-nightly (7057231bd7 2026-02-11)
% % rustfmt +nightly --config=wrap_comments=true --check test.rs
Diff in /home/cyphar/tmp/foo.rs:2:
 //   aaq tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
 //   aaa veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
 //   aaa commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
-//   aaa velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
-//   aaa occaecat cupidatat non proident, sunt in culpa qui officia deserunt
-//   aaa mollit anim id est laborum.
+//   aaa velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint aaa
+//   occaecat cupidatat non proident, sunt in culpa qui officia deserunt aaa
+//   mollit anim id est laborum.

 fn bad_comment() {
     // * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
Diff in /home/cyphar/tmp/foo.rs:11:
     //   tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
     //   veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
     //   commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
-    //   velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
-    //   occaecat cupidatat non proident, sunt in culpa qui officia deserunt
-    //   mollit anim id est laborum.
+    //   velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
+    //   cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
+    //   est laborum.

     ()
 }
Diff in /home/cyphar/tmp/foo.rs:34:
 //   aaq tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
 //   aaa veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
 //   aaa commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
-//   aaa velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
-//   aaa occaecat cupidatat non proident, sunt in culpa qui officia deserunt
-//   aaa mollit anim id est laborum.
+//   aaa velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint aaa
+//   occaecat cupidatat non proident, sunt in culpa qui officia deserunt aaa
+//   mollit anim id est laborum.

As far as I can see, this occurs on all editions.

Metadata

Metadata

Labels

needs-triageThis issue or PR needs triaging to determine its status. Remove label once sufficiently triaged.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions