Fix overflow in error emitter

This commit is contained in:
Badel2 2023-05-19 00:44:14 +02:00
parent 8a281f9c79
commit cbb41008fd
6 changed files with 108 additions and 22 deletions

View file

@ -2303,22 +2303,25 @@ impl EmitterWriter {
// Colorize addition/replacements with green. // Colorize addition/replacements with green.
for &SubstitutionHighlight { start, end } in highlight_parts { for &SubstitutionHighlight { start, end } in highlight_parts {
// Account for tabs when highlighting (#87972). // This is a no-op for empty ranges
let tabs: usize = line_to_add if start != end {
.chars() // Account for tabs when highlighting (#87972).
.take(start) let tabs: usize = line_to_add
.map(|ch| match ch { .chars()
'\t' => 3, .take(start)
_ => 0, .map(|ch| match ch {
}) '\t' => 3,
.sum(); _ => 0,
buffer.set_style_range( })
*row_num, .sum();
max_line_num_len + 3 + start + tabs, buffer.set_style_range(
max_line_num_len + 3 + end + tabs, *row_num,
Style::Addition, max_line_num_len + 3 + start + tabs,
true, max_line_num_len + 3 + end + tabs,
); Style::Addition,
true,
);
}
} }
*row_num += 1; *row_num += 1;
} }

View file

@ -330,12 +330,11 @@ impl CodeSuggestion {
}); });
buf.push_str(&part.snippet); buf.push_str(&part.snippet);
let cur_hi = sm.lookup_char_pos(part.span.hi()); let cur_hi = sm.lookup_char_pos(part.span.hi());
if cur_hi.line == cur_lo.line && !part.snippet.is_empty() { // Account for the difference between the width of the current code and the
// Account for the difference between the width of the current code and the // snippet being suggested, so that the *later* suggestions are correctly
// snippet being suggested, so that the *later* suggestions are correctly // aligned on the screen. Note that cur_hi and cur_lo can be on different
// aligned on the screen. // lines, so cur_hi.col can be smaller than cur_lo.col
acc += len - (cur_hi.col.0 - cur_lo.col.0) as isize; acc += len - (cur_hi.col.0 as isize - cur_lo.col.0 as isize);
}
prev_hi = cur_hi; prev_hi = cur_hi;
prev_line = sf.get_line(prev_hi.line - 1); prev_line = sf.get_line(prev_hi.line - 1);
for line in part.snippet.split('\n').skip(1) { for line in part.snippet.split('\n').skip(1) {

View file

@ -0,0 +1,12 @@
fn generate_setter() {
String::with_capacity(
//~^ ERROR this function takes 1 argument but 3 arguments were supplied
generate_setter,
r#"
pub(crate) struct Person<T: Clone> {}
"#,
r#""#,
);
}
fn main() {}

View file

@ -0,0 +1,31 @@
error[E0061]: this function takes 1 argument but 3 arguments were supplied
--> $DIR/issue-109854.rs:2:5
|
LL | String::with_capacity(
| ^^^^^^^^^^^^^^^^^^^^^
...
LL | / r#"
LL | | pub(crate) struct Person<T: Clone> {}
LL | | "#,
| |__- unexpected argument of type `&'static str`
LL | r#""#,
| ----- unexpected argument of type `&'static str`
|
note: expected `usize`, found fn item
--> $DIR/issue-109854.rs:4:5
|
LL | generate_setter,
| ^^^^^^^^^^^^^^^
= note: expected type `usize`
found fn item `fn() {generate_setter}`
note: associated function defined here
--> $SRC_DIR/alloc/src/string.rs:LL:COL
help: remove the extra arguments
|
LL - generate_setter,
LL + /* usize */,
|
error: aborting due to previous error
For more information about this error, try `rustc --explain E0061`.

View file

@ -0,0 +1,5 @@
fn L(]{match
(; {`
//~^^ ERROR mismatched closing delimiter
//~^^ ERROR unknown start of token
//~ ERROR this file contains an unclosed delimiter

View file

@ -0,0 +1,36 @@
error: unknown start of token: `
--> $DIR/issue-94171.rs:2:5
|
LL | (; {`
| ^
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
LL | (; {'
| ~
error: mismatched closing delimiter: `]`
--> $DIR/issue-94171.rs:1:5
|
LL | fn L(]{match
| ^^ mismatched closing delimiter
| |
| unclosed delimiter
error: this file contains an unclosed delimiter
--> $DIR/issue-94171.rs:5:52
|
LL | fn L(]{match
| -- unclosed delimiter
| |
| missing open `[` for this delimiter
LL | (; {`
| - - unclosed delimiter
| |
| unclosed delimiter
...
LL |
| ^
error: aborting due to 3 previous errors