Rollup merge of #68084 - estebank:ice-68000, r=varkor
Do not ICE on unicode next point Use `shrink_to_hi` instead of `next_point` and fix `next_point`. Fix #68000, fix #68091, fix #68092.
This commit is contained in:
commit
cacda2d7a0
@ -106,7 +106,7 @@ fn parse_assert<'a>(
|
||||
let custom_message =
|
||||
if let token::Literal(token::Lit { kind: token::Str, .. }) = parser.token.kind {
|
||||
let mut err = cx.struct_span_warn(parser.token.span, "unexpected string literal");
|
||||
let comma_span = cx.source_map().next_point(parser.prev_span);
|
||||
let comma_span = parser.prev_span.shrink_to_hi();
|
||||
err.span_suggestion_short(
|
||||
comma_span,
|
||||
"try adding a comma",
|
||||
|
@ -182,7 +182,7 @@ impl CodeSuggestion {
|
||||
|
||||
// Find the bounding span.
|
||||
let lo = substitution.parts.iter().map(|part| part.span.lo()).min().unwrap();
|
||||
let hi = substitution.parts.iter().map(|part| part.span.hi()).min().unwrap();
|
||||
let hi = substitution.parts.iter().map(|part| part.span.hi()).max().unwrap();
|
||||
let bounding_span = Span::with_root_ctxt(lo, hi);
|
||||
let lines = cm.span_to_lines(bounding_span).unwrap();
|
||||
assert!(!lines.lines.is_empty());
|
||||
|
@ -696,7 +696,7 @@ pub(super) fn parse(
|
||||
if parser.token.span.is_dummy() {
|
||||
parser.token.span
|
||||
} else {
|
||||
sess.source_map().next_point(parser.token.span)
|
||||
parser.token.span.shrink_to_hi()
|
||||
},
|
||||
),
|
||||
"missing tokens in macro arguments",
|
||||
|
@ -259,10 +259,7 @@ impl<'a> Parser<'a> {
|
||||
};
|
||||
(
|
||||
format!("expected one of {}, found {}", expect, actual),
|
||||
(
|
||||
self.sess.source_map().next_point(self.prev_span),
|
||||
format!("expected one of {}", short_expect),
|
||||
),
|
||||
(self.prev_span.shrink_to_hi(), format!("expected one of {}", short_expect)),
|
||||
)
|
||||
} else if expected.is_empty() {
|
||||
(
|
||||
@ -272,7 +269,7 @@ impl<'a> Parser<'a> {
|
||||
} else {
|
||||
(
|
||||
format!("expected {}, found {}", expect, actual),
|
||||
(self.sess.source_map().next_point(self.prev_span), format!("expected {}", expect)),
|
||||
(self.prev_span.shrink_to_hi(), format!("expected {}", expect)),
|
||||
)
|
||||
};
|
||||
self.last_unexpected_token_span = Some(self.token.span);
|
||||
@ -803,7 +800,7 @@ impl<'a> Parser<'a> {
|
||||
_ if self.prev_span == DUMMY_SP => (self.token.span, self.token.span),
|
||||
// EOF, don't want to point at the following char, but rather the last token.
|
||||
(token::Eof, None) => (self.prev_span, self.token.span),
|
||||
_ => (self.sess.source_map().next_point(self.prev_span), self.token.span),
|
||||
_ => (self.prev_span.shrink_to_hi(), self.token.span),
|
||||
};
|
||||
let msg = format!(
|
||||
"expected `{}`, found {}",
|
||||
@ -1126,7 +1123,7 @@ impl<'a> Parser<'a> {
|
||||
err.span_label(sp, "unclosed delimiter");
|
||||
}
|
||||
err.span_suggestion_short(
|
||||
self.sess.source_map().next_point(self.prev_span),
|
||||
self.prev_span.shrink_to_hi(),
|
||||
&format!("{} may belong here", delim.to_string()),
|
||||
delim.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
|
@ -1645,7 +1645,7 @@ impl<'a> Parser<'a> {
|
||||
// | |
|
||||
// | parsed until here as `"y" & X`
|
||||
err.span_suggestion_short(
|
||||
cm.next_point(arm_start_span),
|
||||
arm_start_span.shrink_to_hi(),
|
||||
"missing a comma here to end this `match` arm",
|
||||
",".to_owned(),
|
||||
Applicability::MachineApplicable,
|
||||
|
@ -1510,7 +1510,7 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
let sp = self.sess.source_map().next_point(self.prev_span);
|
||||
let sp = self.prev_span.shrink_to_hi();
|
||||
let mut err = self.struct_span_err(
|
||||
sp,
|
||||
&format!("expected `,`, or `}}`, found {}", super::token_descr(&self.token)),
|
||||
@ -1649,7 +1649,7 @@ impl<'a> Parser<'a> {
|
||||
// it's safe to peel off one character only when it has the close delim
|
||||
self.prev_span.with_lo(self.prev_span.hi() - BytePos(1))
|
||||
} else {
|
||||
self.sess.source_map().next_point(self.prev_span)
|
||||
self.prev_span.shrink_to_hi()
|
||||
};
|
||||
|
||||
self.struct_span_err(
|
||||
@ -1665,7 +1665,7 @@ impl<'a> Parser<'a> {
|
||||
Applicability::MaybeIncorrect,
|
||||
)
|
||||
.span_suggestion(
|
||||
self.sess.source_map().next_point(self.prev_span),
|
||||
self.prev_span.shrink_to_hi(),
|
||||
"add a semicolon",
|
||||
';'.to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
|
@ -765,7 +765,7 @@ impl<'a> Parser<'a> {
|
||||
break;
|
||||
}
|
||||
Err(mut expect_err) => {
|
||||
let sp = self.sess.source_map().next_point(self.prev_span);
|
||||
let sp = self.prev_span.shrink_to_hi();
|
||||
let token_str = pprust::token_kind_to_string(t);
|
||||
|
||||
// Attempt to keep parsing if it was a similar separator.
|
||||
|
@ -710,7 +710,7 @@ impl SourceMap {
|
||||
pub fn next_point(&self, sp: Span) -> Span {
|
||||
let start_of_next_point = sp.hi().0;
|
||||
|
||||
let width = self.find_width_of_character_at_span(sp, true);
|
||||
let width = self.find_width_of_character_at_span(sp.shrink_to_hi(), true);
|
||||
// If the width is 1, then the next span should point to the same `lo` and `hi`. However,
|
||||
// in the case of a multibyte character, where the width != 1, the next span should
|
||||
// span multiple bytes to include the whole character.
|
||||
|
@ -240,7 +240,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
) = (parent_node, callee_node)
|
||||
{
|
||||
let start = sp.shrink_to_lo();
|
||||
let end = self.tcx.sess.source_map().next_point(callee_span);
|
||||
let end = callee_span.shrink_to_hi();
|
||||
err.multipart_suggestion(
|
||||
"if you meant to create this closure and immediately call it, surround the \
|
||||
closure with parenthesis",
|
||||
@ -317,9 +317,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let call_is_multiline =
|
||||
self.tcx.sess.source_map().is_multiline(call_expr.span);
|
||||
if call_is_multiline {
|
||||
let span = self.tcx.sess.source_map().next_point(callee.span);
|
||||
err.span_suggestion(
|
||||
span,
|
||||
callee.span.shrink_to_hi(),
|
||||
"try adding a semicolon",
|
||||
";".to_owned(),
|
||||
Applicability::MaybeIncorrect,
|
||||
|
@ -4952,9 +4952,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
| ExprKind::Loop(..)
|
||||
| ExprKind::Match(..)
|
||||
| ExprKind::Block(..) => {
|
||||
let sp = self.tcx.sess.source_map().next_point(cause_span);
|
||||
err.span_suggestion(
|
||||
sp,
|
||||
cause_span.shrink_to_hi(),
|
||||
"try adding a semicolon",
|
||||
";".to_string(),
|
||||
Applicability::MachineApplicable,
|
||||
|
@ -0,0 +1,6 @@
|
||||
pub struct Foo {
|
||||
pub bar: Vec<i32>ö
|
||||
//~^ ERROR expected `,`, or `}`, found `ö`
|
||||
} //~ ERROR expected `:`, found `}`
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,17 @@
|
||||
error: expected `,`, or `}`, found `ö`
|
||||
--> $DIR/issue-68000-unicode-ident-after-missing-comma.rs:2:22
|
||||
|
|
||||
LL | pub bar: Vec<i32>ö
|
||||
| ^ help: try adding a comma: `,`
|
||||
|
||||
error: expected `:`, found `}`
|
||||
--> $DIR/issue-68000-unicode-ident-after-missing-comma.rs:4:1
|
||||
|
|
||||
LL | pub bar: Vec<i32>ö
|
||||
| - expected `:`
|
||||
LL |
|
||||
LL | }
|
||||
| ^ unexpected token
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
9
src/test/ui/issues/issue-68091-unicode-ident-after-if.rs
Normal file
9
src/test/ui/issues/issue-68091-unicode-ident-after-if.rs
Normal file
@ -0,0 +1,9 @@
|
||||
macro_rules! x {
|
||||
($($c:tt)*) => {
|
||||
$($c)ö* {} //~ ERROR missing condition for `if` expression
|
||||
}; //~| ERROR mismatched types
|
||||
}
|
||||
|
||||
fn main() {
|
||||
x!(if);
|
||||
}
|
18
src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr
Normal file
18
src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr
Normal file
@ -0,0 +1,18 @@
|
||||
error: missing condition for `if` expression
|
||||
--> $DIR/issue-68091-unicode-ident-after-if.rs:3:14
|
||||
|
|
||||
LL | $($c)ö* {}
|
||||
| ^ expected if condition here
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-68091-unicode-ident-after-if.rs:3:17
|
||||
|
|
||||
LL | $($c)ö* {}
|
||||
| ^^ expected `bool`, found `()`
|
||||
...
|
||||
LL | x!(if);
|
||||
| ------- in this macro invocation
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -0,0 +1,9 @@
|
||||
macro_rules! x {
|
||||
($($c:tt)*) => {
|
||||
$($c)ö* //~ ERROR macro expansion ends with an incomplete expression: expected expression
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {
|
||||
x!(!);
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
error: macro expansion ends with an incomplete expression: expected expression
|
||||
--> $DIR/issue-68092-unicode-ident-after-incomplete-expr.rs:3:14
|
||||
|
|
||||
LL | $($c)ö*
|
||||
| ^ expected expression
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
x
Reference in New Issue
Block a user