From eeb1bd18dc172c2ba80c116d711214c2cdac3e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Thu, 25 Jul 2019 15:59:38 -0700 Subject: [PATCH 1/2] Avoid ICE when suggestion span is at Eof --- src/librustc_errors/lib.rs | 3 +- src/test/ui/parser/issue-62973.rs | 8 ++++ src/test/ui/parser/issue-62973.stderr | 61 +++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/parser/issue-62973.rs create mode 100644 src/test/ui/parser/issue-62973.stderr diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs index 3269b85d0dd13..67fae1f676923 100644 --- a/src/librustc_errors/lib.rs +++ b/src/librustc_errors/lib.rs @@ -229,7 +229,8 @@ impl CodeSuggestion { } } if let Some(cur_line) = fm.get_line(cur_lo.line - 1) { - buf.push_str(&cur_line[..cur_lo.col.to_usize()]); + let end = std::cmp::min(cur_line.len(), cur_lo.col.to_usize()); + buf.push_str(&cur_line[..end]); } } buf.push_str(&part.snippet); diff --git a/src/test/ui/parser/issue-62973.rs b/src/test/ui/parser/issue-62973.rs new file mode 100644 index 0000000000000..c04608e055030 --- /dev/null +++ b/src/test/ui/parser/issue-62973.rs @@ -0,0 +1,8 @@ +// ignore-tidy-end-whitespace +// error-pattern: aborting due to 6 previous errors + +fn main() {} + +fn p() { match s { v, E { [) {) } + + diff --git a/src/test/ui/parser/issue-62973.stderr b/src/test/ui/parser/issue-62973.stderr new file mode 100644 index 0000000000000..141076bf6b638 --- /dev/null +++ b/src/test/ui/parser/issue-62973.stderr @@ -0,0 +1,61 @@ +error: this file contains an un-closed delimiter + --> $DIR/issue-62973.rs:8:2 + | +LL | fn p() { match s { v, E { [) {) } + | - - un-closed delimiter + | | + | un-closed delimiter +LL | +LL | + | ^ + +error: expected one of `,` or `}`, found `{` + --> $DIR/issue-62973.rs:6:25 + | +LL | fn p() { match s { v, E { [) {) } + | - ^ expected one of `,` or `}` here + | | + | while parsing this struct + +error: struct literals are not allowed here + --> $DIR/issue-62973.rs:6:16 + | +LL | fn p() { match s { v, E { [) {) } + | ________________^ +LL | | +LL | | + | |_^ +help: surround the struct literal with parentheses + | +LL | fn p() { match (s { v, E { [) {) } +LL | +LL | ) + | + +error: expected one of `.`, `?`, `{`, or an operator, found `}` + --> $DIR/issue-62973.rs:8:1 + | +LL | fn p() { match s { v, E { [) {) } + | ----- while parsing this match expression +LL | +LL | + | ^ expected one of `.`, `?`, `{`, or an operator here + +error: incorrect close delimiter: `)` + --> $DIR/issue-62973.rs:6:28 + | +LL | fn p() { match s { v, E { [) {) } + | -^ incorrect close delimiter + | | + | un-closed delimiter + +error: incorrect close delimiter: `)` + --> $DIR/issue-62973.rs:6:31 + | +LL | fn p() { match s { v, E { [) {) } + | -^ incorrect close delimiter + | | + | un-closed delimiter + +error: aborting due to 6 previous errors + From 6263eb438def79c393e372eac1237b4d4f97772f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Thu, 25 Jul 2019 16:26:33 -0700 Subject: [PATCH 2/2] ignore-tidy-trailing-newlines --- src/test/ui/parser/issue-62973.rs | 2 +- src/tools/tidy/src/style.rs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/test/ui/parser/issue-62973.rs b/src/test/ui/parser/issue-62973.rs index c04608e055030..18bc51e7ba7cd 100644 --- a/src/test/ui/parser/issue-62973.rs +++ b/src/test/ui/parser/issue-62973.rs @@ -1,4 +1,4 @@ -// ignore-tidy-end-whitespace +// ignore-tidy-trailing-newlines // error-pattern: aborting due to 6 previous errors fn main() {} diff --git a/src/tools/tidy/src/style.rs b/src/tools/tidy/src/style.rs index 4a159d926b7cc..6a0d530e2362a 100644 --- a/src/tools/tidy/src/style.rs +++ b/src/tools/tidy/src/style.rs @@ -152,6 +152,8 @@ pub fn check(path: &Path, bad: &mut bool) { let mut skip_file_length = contains_ignore_directive(can_contain, &contents, "filelength"); let mut skip_end_whitespace = contains_ignore_directive(can_contain, &contents, "end-whitespace"); + let mut skip_trailing_newlines = + contains_ignore_directive(can_contain, &contents, "trailing-newlines"); let mut skip_copyright = contains_ignore_directive(can_contain, &contents, "copyright"); let mut leading_new_lines = false; let mut trailing_new_lines = 0; @@ -214,10 +216,17 @@ pub fn check(path: &Path, bad: &mut bool) { if leading_new_lines { tidy_error!(bad, "{}: leading newline", file.display()); } + let mut err = |msg: &str| { + tidy_error!(bad, "{}: {}", file.display(), msg); + }; match trailing_new_lines { - 0 => tidy_error!(bad, "{}: missing trailing newline", file.display()), + 0 => suppressible_tidy_err!(err, skip_trailing_newlines, "missing trailing newline"), 1 => {} - n => tidy_error!(bad, "{}: too many trailing newlines ({})", file.display(), n), + n => suppressible_tidy_err!( + err, + skip_trailing_newlines, + &format!("too many trailing newlines ({})", n) + ), }; if lines > LINES { let mut err = |_| { @@ -247,6 +256,9 @@ pub fn check(path: &Path, bad: &mut bool) { if let Directive::Ignore(false) = skip_end_whitespace { tidy_error!(bad, "{}: ignoring trailing whitespace unnecessarily", file.display()); } + if let Directive::Ignore(false) = skip_trailing_newlines { + tidy_error!(bad, "{}: ignoring trailing newlines unnecessarily", file.display()); + } if let Directive::Ignore(false) = skip_copyright { tidy_error!(bad, "{}: ignoring copyright unnecessarily", file.display()); }