Skip to content

Leading pipes in patterns need to be preserved in the AST #76182

Closed

Description

@Aaron1011

The following code:

fn main() {
     match () { | () => () }
}

is currently pretty-printed as:

fn main() { match () { () => (), } }

If this occurs in a macro invocation, it leads to an instance of #43081

Activity

  1. added
    A-prettyArea: Pretty printing (including `-Z unpretty`)
    A-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)
    C-bugCategory: This is a bug.
    on Aug 31, 2020
  2. danielhenrymantilla commented on Aug 31, 2020

    @danielhenrymantilla
    Contributor

    Extra info (but it boils down to what @Aaron1011 said):

    Using

    fn main ()
    {
        match () { | () => () }
        let () = 42; // I was interested in seeing the error message being correctly spanned
    }

    I get the following log:

    [INFO  rustc_parse] cached tokens found, but they're not "probably equal", going with stringified version
    [INFO  rustc_parse] cached tokens: TokenStream([(Token(Token { kind: Ident("fn", false), span: examples/main.rs:4:1: 4:3 (#0) }), NonJoint), (Token(Token { kind: Ident("main", false), span: examples/main.rs:4:4: 4:8 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:4:9: 4:10 (#0), close: examples/main.rs:4:10: 4:11 (#0) }, Paren, TokenStream([])), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:5:1: 5:2 (#0), close: examples/main.rs:8:1: 8:2 (#0) }, Brace, TokenStream([(Token(Token { kind: Ident("match", false), span: examples/main.rs:6:5: 6:10 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:6:11: 6:12 (#0), close: examples/main.rs:6:12: 6:13 (#0) }, Paren, TokenStream([])), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:6:14: 6:15 (#0), close: examples/main.rs:6:27: 6:28 (#0) }, Brace, TokenStream([(Token(Token { kind: BinOp(Or), span: examples/main.rs:6:16: 6:17 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:6:18: 6:19 (#0), close: examples/main.rs:6:19: 6:20 (#0) }, Paren, TokenStream([])), NonJoint), (Token(Token { kind: FatArrow, span: examples/main.rs:6:21: 6:23 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:6:24: 6:25 (#0), close: examples/main.rs:6:25: 6:26 (#0) }, Paren, TokenStream([])), NonJoint)])), NonJoint), (Token(Token { kind: Ident("let", false), span: examples/main.rs:7:5: 7:8 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:7:9: 7:10 (#0), close: examples/main.rs:7:10: 7:11 (#0) }, Paren, TokenStream([])), NonJoint), (Token(Token { kind: Eq, span: examples/main.rs:7:12: 7:13 (#0) }), NonJoint), (Token(Token { kind: Literal(Lit { kind: Integer, symbol: "42", suffix: None }), span: examples/main.rs:7:14: 7:16 (#0) }), Joint), (Token(Token { kind: Semi, span: examples/main.rs:7:16: 7:17 (#0) }), NonJoint)])), NonJoint)])
    [INFO  rustc_parse] reparsed tokens: TokenStream([(Token(Token { kind: Ident("fn", false), span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint), (Token(Token { kind: Ident("main", false), span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Paren, TokenStream([])), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Brace, TokenStream([(Token(Token { kind: Ident("match", false), span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Paren, TokenStream([])), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Brace, TokenStream([(Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Paren, TokenStream([])), NonJoint), (Token(Token { kind: FatArrow, span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Paren, TokenStream([])), NonJoint), (Token(Token { kind: Comma, span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint)])), NonJoint), (Token(Token { kind: Ident("let", false), span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint), (Delimited(DelimSpan { open: examples/main.rs:1:1: 1:1 (#0), close: examples/main.rs:1:1: 1:1 (#0) }, Paren, TokenStream([])), NonJoint), (Token(Token { kind: Eq, span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint), (Token(Token { kind: Literal(Lit { kind: Integer, symbol: "42", suffix: None }), span: examples/main.rs:1:1: 1:1 (#0) }), Joint), (Token(Token { kind: Semi, span: examples/main.rs:1:1: 1:1 (#0) }), NonJoint)])), NonJoint)])
    

    Rendered diff: https://www.textcompare.org/index.html?id=5f4d8b98086a55001745f791

  3. petrochenkov commented on Sep 1, 2020

    @petrochenkov
    Contributor

    This applies to all trailing separators in theory (except that the separator is leading rather than trailing in this case), but in other cases the difference is fixed up by fuzzy comparison in tokenstream_probably_equal_for_proc_macro.

  4. added a commit that references this issue on Sep 1, 2020
    2b812b5
  5. added a commit that references this issue on Sep 10, 2020
    283d4c4
  6. added 3 commits that reference this issue on Sep 12, 2020
    bd3b10e
    e15c3aa
    c480b71
  7. added a commit that references this issue on Sep 13, 2020
    dd33766
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)A-prettyArea: Pretty printing (including `-Z unpretty`)A-proc-macrosArea: Procedural macrosC-bugCategory: This is a bug.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions