rust-lang / rustfmt

Format Rust code
https://rust-lang.github.io/rustfmt/
Apache License 2.0
5.96k stars 880 forks source link

error reporting loop #5625

Open matthiaskrgr opened 1 year ago

matthiaskrgr commented 1 year ago
// build-pass
// revisions: all strong basic
// compile-flags: --target nvptx64-nvidia-cuda
// needs-llvm-components: nvptx
// [all] compile-flags: -Z stack-protector[no_std]
#[lang = "sized"]

#![crate_type = "lib"]
fn T(){trait Copy {}

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
fn T<'a, main>(){trait Copy {}

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
pub fn T(){trait Copy {}

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
async fn T<'a, main>(){"sized"

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
fn T(){trait Copy {}

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
fn T<'a, main>(){trait Copy {}

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
pub fn T(){trait Copy {}

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
async fn T<'a, main>(){"sized"

#![crate_type = "lib"]
#![feature(no_core, lang_items)]
#![no_std]
#![no_core]

#![crate_type = "lib"]
trait Copy{ {}}
#[lang = ]
fn main(){}

 fn main()fn main(){}

#[lang = ]
fn main(){}

 fn main()fn main(){}
(0)
#[lang = ]
fn main(){}

 fn main()fn main(){}

#[lang = ]
fn main(){}

 fn main()fn main(){}
(0)          

if I run rustfmt on this, it looks like it just prints errors in a loop

ytmimi commented 1 year ago

Confirming I can reproduce this with rustfmt 1.5.1-nightly (ee2bed96 2022-11-08). I don't think this is an issue with rustfmt unless we're calling the parser incorrectly. We call into the rustc parser here: https://github.com/rust-lang/rustfmt/blob/ee2bed96d60fd7e46b1fb868f6a8f27e3a8058d0/src/parse/parser.rs#L166

which will get called when we call Parser::parse_crate from format_project

ytmimi commented 1 year ago

These are the first errors that get emitted

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

error: this file contains an unclosed delimiter
  --> <stdin>:93:15
   |
9  | fn T(){trait Copy {}
   |       - unclosed delimiter
...
17 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
25 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
33 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
41 | fn T(){trait Copy {}
   |       - unclosed delimiter
...
49 | fn T<'a, main>(){trait Copy {}
   |                 - unclosed delimiter
...
57 | pub fn T(){trait Copy {}
   |           - unclosed delimiter
...
65 | async fn T<'a, main>(){"sized"
   |                       - unclosed delimiter
...
93 | (0)          
   |               ^

and I believe they get emitted when we try to build the rustc Parser with either rustc_parse::new_parser_from_file or rustc_parse::maybe_new_parser_from_source_str. Are these lexing errors that should prevent us from creating a rustc_parse::parser::Parser?

https://github.com/rust-lang/rustfmt/blob/ee2bed96d60fd7e46b1fb868f6a8f27e3a8058d0/src/parse/parser.rs#L65-L82