Rollup merge of #100230 - cjgillot:noice-multibyte-amp, r=compiler-errors

Use start_point instead of next_point to point to elided lifetime amp…

Using `next_point` creates a span which points inside the multibyte token, ICEing.

Fixes https://github.com/rust-lang/rust/issues/100224
This commit is contained in:
Matthias Krüger 2022-08-07 21:10:26 +02:00 committed by GitHub
commit 5648add9ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 2 deletions

View File

@ -1228,7 +1228,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
} else {
self.next_node_id()
};
let span = self.tcx.sess.source_map().next_point(t.span.shrink_to_lo());
let span = self.tcx.sess.source_map().start_point(t.span);
Lifetime { ident: Ident::new(kw::UnderscoreLifetime, span), id }
});
let lifetime = self.lower_lifetime(&region);

View File

@ -629,7 +629,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
// Elided lifetime in reference: we resolve as if there was some lifetime `'_` with
// NodeId `ty.id`.
// This span will be used in case of elision failure.
let span = self.r.session.source_map().next_point(ty.span.shrink_to_lo());
let span = self.r.session.source_map().start_point(ty.span);
self.resolve_elided_lifetime(ty.id, span);
visit::walk_ty(self, ty);
}

View File

@ -0,0 +1,7 @@
// Verify that we do not ICE when the user uses a multubyte ampersand.
fn f(_: &()) -> &() { todo!() }
//~^ ERROR unknown start of token: \u{ff06}
//~| ERROR missing lifetime specifier [E0106]
fn main() {}

View File

@ -0,0 +1,26 @@
error: unknown start of token: \u{ff06}
--> $DIR/fullwidth-ampersand.rs:3:10
|
LL | fn f(_: &()) -> &() { todo!() }
| ^^
|
help: Unicode character '' (Fullwidth Ampersand) looks like '&' (Ampersand), but it is not
|
LL | fn f(_: &&()) -> &() { todo!() }
| ~
error[E0106]: missing lifetime specifier
--> $DIR/fullwidth-ampersand.rs:3:18
|
LL | fn f(_: &()) -> &() { todo!() }
| ----- ^ expected named lifetime parameter
|
= help: this function's return type contains a borrowed value, but the signature does not say which one of argument 1's 2 lifetimes it is borrowed from
help: consider introducing a named lifetime parameter
|
LL | fn f<'a>(_: &'a 'a ()) -> &'a () { todo!() }
| ++++ ++ ++ ++
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0106`.