1
Fork 0

Fix non-constant value ICE (#90878)

This also fixes the same suggestion, which was kind of broken, because it just searched for the last occurence of `const` to replace with a `let`. This works great in some cases, but when there is no const and a leading space to the file, it doesn't work and panic with overflow because it thought that it had found a const.

I also changed the suggestion to only trigger if the `const` and the non-constant value are on the same line, because if they aren't, the suggestion is very likely to be wrong.

Also don't trigger the suggestion if the found `const` is on line 0, because that triggers the ICE.
This commit is contained in:
Nilstrieb 2021-11-15 20:40:29 +01:00
parent eab2d7519a
commit d64aea65ad
8 changed files with 100 additions and 1 deletions

View file

@ -450,9 +450,23 @@ impl<'a> Resolver<'a> {
// let foo =...
// ^^^ given this Span
// ------- get this Span to have an applicable suggestion
// edit:
// only do this if the const and usage of the non-constant value are on the same line
// the further the two are apart, the higher the chance of the suggestion being wrong
// also make sure that this line isn't the first one (ICE #90878)
let sp =
self.session.source_map().span_extend_to_prev_str(ident.span, current, true);
if sp.lo().0 == 0 {
let is_first_line = self
.session
.source_map()
.lookup_line(sp.lo())
.map(|file_and_line| file_and_line.line == 0)
.unwrap_or(true);
if sp.lo().0 == 0 || self.session.source_map().is_multiline(sp) || is_first_line {
err.span_label(ident.span, &format!("this would need to be a `{}`", sugg));
} else {
let sp = sp.with_lo(BytePos(sp.lo().0 - current.len() as u32));