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.
for &SubstitutionHighlight { start, end } in highlight_parts {
// Account for tabs when highlighting (#87972).
let tabs: usize = line_to_add
.chars()
.take(start)
.map(|ch| match ch {
'\t' => 3,
_ => 0,
})
.sum();
buffer.set_style_range(
*row_num,
max_line_num_len + 3 + start + tabs,
max_line_num_len + 3 + end + tabs,
Style::Addition,
true,
);
// This is a no-op for empty ranges
if start != end {
// Account for tabs when highlighting (#87972).
let tabs: usize = line_to_add
.chars()
.take(start)
.map(|ch| match ch {
'\t' => 3,
_ => 0,
})
.sum();
buffer.set_style_range(
*row_num,
max_line_num_len + 3 + start + tabs,
max_line_num_len + 3 + end + tabs,
Style::Addition,
true,
);
}
}
*row_num += 1;
}

View File

@ -330,12 +330,11 @@ impl CodeSuggestion {
});
buf.push_str(&part.snippet);
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
// snippet being suggested, so that the *later* suggestions are correctly
// aligned on the screen.
acc += len - (cur_hi.col.0 - cur_lo.col.0) as isize;
}
// Account for the difference between the width of the current code and the
// 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
// lines, so cur_hi.col can be smaller than cur_lo.col
acc += len - (cur_hi.col.0 as isize - cur_lo.col.0 as isize);
prev_hi = cur_hi;
prev_line = sf.get_line(prev_hi.line - 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