Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not ICE on unicode next point #68084

Merged
merged 5 commits into from
Jan 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/librustc_builtin_macros/assert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_errors/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_expand/mbe/macro_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
11 changes: 4 additions & 7 deletions src/librustc_parse/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,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() {
(
Expand All @@ -278,7 +275,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);
Expand Down Expand Up @@ -809,7 +806,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 {}",
Expand Down Expand Up @@ -1132,7 +1129,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,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_parse/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1646,7 +1646,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,
Expand Down
6 changes: 3 additions & 3 deletions src/librustc_parse/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1489,7 +1489,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)),
Expand Down Expand Up @@ -1628,7 +1628,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(
Expand All @@ -1644,7 +1644,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,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_parse/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_span/source_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the only necessary change to stop the ICEs in stable and beta.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isolated change is stable-accepted

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.
Expand Down
5 changes: 2 additions & 3 deletions src/librustc_typeck/check/callee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,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",
Expand Down Expand Up @@ -319,9 +319,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,
Expand Down
3 changes: 1 addition & 2 deletions src/librustc_typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4953,9 +4953,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,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
pub struct Foo {
pub bar: Vec<i32>ö
//~^ ERROR expected `,`, or `}`, found `ö`
} //~ ERROR expected `:`, found `}`

fn main() {}
Original file line number Diff line number Diff line change
@@ -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 changes: 9 additions & 0 deletions src/test/ui/issues/issue-68091-unicode-ident-after-if.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
macro_rules! x {
($($c:tt)*) => {
$($c)ö* {} //~ ERROR missing condition for `if` expression
}; //~| ERROR mismatched types
}

fn main() {
x!(if);
}
18 changes: 18 additions & 0 deletions src/test/ui/issues/issue-68091-unicode-ident-after-if.stderr
Original file line number Diff line number Diff line change
@@ -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`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
macro_rules! x {
($($c:tt)*) => {
$($c)ö* //~ ERROR macro expansion ends with an incomplete expression: expected expression
};
}

fn main() {
x!(!);
}
Original file line number Diff line number Diff line change
@@ -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