Skip to content

Commit

Permalink
Unrolled build for rust-lang#123609
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#123609 - compiler-errors:greek-question-mark, r=jieyouxu

Don't use bytepos offsets when computing semicolon span for removal

Causes problems when we recover confusable characters w/ a different byte width

Fixes rust-lang#123607
  • Loading branch information
rust-timer authored Apr 10, 2024
2 parents 93c131e + 3253c02 commit c7cab26
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 27 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_ast_passes/src/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ impl<'a> AstValidator<'a> {
in_impl: matches!(parent, TraitOrTraitImpl::TraitImpl { .. }),
const_context_label: parent_constness,
remove_const_sugg: (
self.session.source_map().span_extend_while(span, |c| c == ' ').unwrap_or(span),
self.session.source_map().span_extend_while_whitespace(span),
match parent_constness {
Some(_) => rustc_errors::Applicability::MachineApplicable,
None => rustc_errors::Applicability::MaybeIncorrect,
Expand Down
3 changes: 1 addition & 2 deletions compiler/rustc_hir_typeck/src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2023,8 +2023,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
.tcx
.sess
.source_map()
.span_extend_while(range_start.span, |c| c.is_whitespace())
.unwrap_or(range_start.span)
.span_extend_while_whitespace(range_start.span)
.shrink_to_hi()
.to(range_end.span);

Expand Down
15 changes: 9 additions & 6 deletions compiler/rustc_infer/src/infer/error_reporting/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use rustc_middle::traits::{
};
use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::{self as ty, GenericArgKind, IsSuggestable, Ty, TypeVisitableExt};
use rustc_span::{sym, BytePos, Span};
use rustc_span::{sym, Span};

use crate::errors::{
ConsiderAddingAwait, FnConsiderCasting, FnItemsAreDistinct, FnUniqTypes,
Expand Down Expand Up @@ -763,8 +763,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
let mac_call = rustc_span::source_map::original_sp(last_stmt.span, blk.span);
self.tcx.sess.source_map().mac_call_stmt_semi_span(mac_call)?
} else {
last_stmt.span.with_lo(last_stmt.span.hi() - BytePos(1))
self.tcx
.sess
.source_map()
.span_extend_while_whitespace(last_expr.span)
.shrink_to_hi()
.with_hi(last_stmt.span.hi())
};

Some((span, needs_box))
}

Expand Down Expand Up @@ -867,10 +873,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
format!(" {ident} ")
};
let left_span = sm.span_through_char(blk.span, '{').shrink_to_hi();
(
sm.span_extend_while(left_span, |c| c.is_whitespace()).unwrap_or(left_span),
sugg,
)
(sm.span_extend_while_whitespace(left_span), sugg)
};
Some(SuggestRemoveSemiOrReturnBinding::Add { sp: span, code: sugg, ident: *ident })
}
Expand Down
5 changes: 1 addition & 4 deletions compiler/rustc_lint/src/context/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,10 +215,7 @@ pub(super) fn builtin(sess: &Session, diagnostic: BuiltinLintDiag, diag: &mut Di
if let Some(deletion_span) = deletion_span {
let msg = "elide the single-use lifetime";
let (use_span, replace_lt) = if elide {
let use_span = sess
.source_map()
.span_extend_while(use_span, char::is_whitespace)
.unwrap_or(use_span);
let use_span = sess.source_map().span_extend_while_whitespace(use_span);
(use_span, String::new())
} else {
(use_span, "'_".to_owned())
Expand Down
15 changes: 9 additions & 6 deletions compiler/rustc_span/src/source_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,12 @@ impl SourceMap {
})
}

/// Extends the span to include any trailing whitespace, or returns the original
/// span if a `SpanSnippetError` was encountered.
pub fn span_extend_while_whitespace(&self, span: Span) -> Span {
self.span_extend_while(span, char::is_whitespace).unwrap_or(span)
}

/// Extends the given `Span` to previous character while the previous character matches the predicate
pub fn span_extend_prev_while(
&self,
Expand Down Expand Up @@ -1034,12 +1040,9 @@ impl SourceMap {
/// // ^^^^^^ input
/// ```
pub fn mac_call_stmt_semi_span(&self, mac_call: Span) -> Option<Span> {
let span = self.span_extend_while(mac_call, char::is_whitespace).ok()?;
let span = span.shrink_to_hi().with_hi(BytePos(span.hi().0.checked_add(1)?));
if self.span_to_snippet(span).as_deref() != Ok(";") {
return None;
}
Some(span)
let span = self.span_extend_while_whitespace(mac_call);
let span = self.next_point(span);
if self.span_to_snippet(span).as_deref() == Ok(";") { Some(span) } else { None }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1592,8 +1592,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
.tcx
.sess
.source_map()
.span_extend_while(expr_span, char::is_whitespace)
.unwrap_or(expr_span)
.span_extend_while_whitespace(expr_span)
.shrink_to_hi()
.to(await_expr.span.shrink_to_hi());
err.span_suggestion(
Expand Down Expand Up @@ -4851,10 +4850,7 @@ pub fn suggest_desugaring_async_fn_to_impl_future_in_trait<'tcx>(
let hir::IsAsync::Async(async_span) = sig.header.asyncness else {
return None;
};
let Ok(async_span) = tcx.sess.source_map().span_extend_while(async_span, |c| c.is_whitespace())
else {
return None;
};
let async_span = tcx.sess.source_map().span_extend_while_whitespace(async_span);

let future = tcx.hir_node_by_def_id(opaque_def_id).expect_item().expect_opaque_ty();
let [hir::GenericBound::Trait(trait_ref, _)] = future.bounds else {
Expand Down
3 changes: 1 addition & 2 deletions src/tools/clippy/clippy_lints/src/lifetimes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,7 @@ fn elision_suggestions(
let span = cx
.sess()
.source_map()
.span_extend_while(usage.ident.span, |ch| ch.is_ascii_whitespace())
.unwrap_or(usage.ident.span);
.span_extend_while_whitespace(usage.ident.span);

(span, String::new())
},
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/typeck/remove-semi-but-confused-char.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Ensures our "remove semicolon" suggestion isn't hardcoded with a character width,
// in case it was accidentally mixed up with a greek question mark.
// issue: rust-lang/rust#123607

pub fn square(num: i32) -> i32 {
//~^ ERROR mismatched types
num * num;
//~^ ERROR unknown start of token
}

fn main() {}
25 changes: 25 additions & 0 deletions tests/ui/typeck/remove-semi-but-confused-char.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
error: unknown start of token: \u{37e}
--> $DIR/remove-semi-but-confused-char.rs:7:14
|
LL | num * num;
| ^
|
help: Unicode character ';' (Greek Question Mark) looks like ';' (Semicolon), but it is not
|
LL | num * num;
| ~

error[E0308]: mismatched types
--> $DIR/remove-semi-but-confused-char.rs:5:28
|
LL | pub fn square(num: i32) -> i32 {
| ------ ^^^ expected `i32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
LL |
LL | num * num;
| - help: remove this semicolon to return this value

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit c7cab26

Please sign in to comment.