rust-lang / rust-lang/rustfmt

Rustfmt incorrectly adds whitespace inside multiline string literals within macro calls that have curly braces

Open
#5,283 7 comments 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-macros A-strings C-bug
Dominant language
Rust
Stars
7k
Forks
1.1k
Avg merge
2d 13h
Merged PRs (30d)
24

Description

Code:

macro_rules! test {
    ($l:literal) => {};
}

fn main() {
    test!{
        "
"};
}

expected output:

macro_rules! test {
    ($l:literal) => {};
}

fn main() {
    test!{
        "
"
    };
}

actual output:

macro_rules! test {
    ($l:literal) => {};
}

fn main() {
    test! {
            "
    "};
}

Rustfmt added an extra indentation to the literal, including inside the string itself. This only occurs when the macro invocation is delimited by curly brackets, it works fine when square or parentheses are used.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running rustfmt on the supplied Rust snippet and compare the curly-braced macro invocation with square- and parenthesized forms. Trace the macro-call formatting path that handles multiline string literals and delimiters. Done means the curly-braced example matches the expected output without changing the string contents, while the other delimiter cases remain correct.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.