diff options
| author | Michael Goulet <michael@errs.io> | 2022-06-27 20:23:24 -0700 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-06-28 22:34:13 +0000 |
| commit | 8fd73560b3ba9d970887b36e335de256ca293c80 (patch) | |
| tree | 2bab3bfc2f71d25e07690b9fdc594590198f232b /compiler | |
| parent | f4fdcc7e24aefb1b75cbe075a475632b525c7a78 (diff) | |
Do not use a suggestion to change a binding's name to a type
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs | 55 | ||||
| -rw-r--r-- | compiler/rustc_mir_build/src/build/mod.rs | 6 |
2 files changed, 35 insertions, 26 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs b/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs index 861c5e973f1..49b24a05071 100644 --- a/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs +++ b/compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs @@ -434,8 +434,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { match self.local_names[local] { Some(name) if !local_decl.from_compiler_desugaring() => { - let label = match local_decl.local_info.as_ref().unwrap() { - box LocalInfo::User(ClearCrossCrate::Set( + let label = match local_decl.local_info.as_deref().unwrap() { + LocalInfo::User(ClearCrossCrate::Set( mir::BindingForm::ImplicitSelf(_), )) => { let (span, suggestion) = @@ -443,7 +443,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { Some((true, span, suggestion)) } - box LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var( + LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var( mir::VarBindingForm { binding_mode: ty::BindingMode::BindByValue(_), opt_ty_info, @@ -473,20 +473,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { // on for loops, RHS points to the iterator part Some(DesugaringKind::ForLoop) => { self.suggest_similar_mut_method_for_for_loop(&mut err); - Some(( - false, - opt_assignment_rhs_span.unwrap(), - format!( - "this iterator yields `{SIGIL}` {DESC}s", - SIGIL = pointer_sigil, - DESC = pointer_desc - ), - )) + err.span_label(opt_assignment_rhs_span.unwrap(), format!( + "this iterator yields `{pointer_sigil}` {pointer_desc}s", + )); + None } // don't create labels for compiler-generated spans Some(_) => None, None => { - let (span, suggestion) = if name != kw::SelfLower { + let label = if name != kw::SelfLower { suggest_ampmut( self.infcx.tcx, local_decl, @@ -501,7 +496,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { .. }), ))) => { - suggest_ampmut_self(self.infcx.tcx, local_decl) + let (span, sugg) = suggest_ampmut_self( + self.infcx.tcx, + local_decl, + ); + (true, span, sugg) } // explicit self (eg `self: &'a Self`) _ => suggest_ampmut( @@ -512,12 +511,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { ), } }; - Some((true, span, suggestion)) + Some(label) } } } - box LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var( + LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var( mir::VarBindingForm { binding_mode: ty::BindingMode::BindByReference(_), .. @@ -528,7 +527,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { .map(|replacement| (true, pattern_span, replacement)) } - box LocalInfo::User(ClearCrossCrate::Clear) => { + LocalInfo::User(ClearCrossCrate::Clear) => { bug!("saw cleared local state") } @@ -559,7 +558,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { } } Some((false, err_label_span, message)) => { - err.span_label(err_label_span, &message); + err.span_label( + err_label_span, + &format!( + "consider changing this binding's type to be: `{message}`" + ), + ); } None => {} } @@ -1004,7 +1008,7 @@ fn suggest_ampmut<'tcx>( local_decl: &mir::LocalDecl<'tcx>, opt_assignment_rhs_span: Option<Span>, opt_ty_info: Option<Span>, -) -> (Span, String) { +) -> (bool, Span, String) { if let Some(assignment_rhs_span) = opt_assignment_rhs_span && let Ok(src) = tcx.sess.source_map().span_to_snippet(assignment_rhs_span) { @@ -1028,24 +1032,24 @@ fn suggest_ampmut<'tcx>( let lt_name = &src[1..ws_pos]; let ty = src[ws_pos..].trim_start(); if !is_mutbl(ty) { - return (assignment_rhs_span, format!("&{lt_name} mut {ty}")); + return (true, assignment_rhs_span, format!("&{lt_name} mut {ty}")); } } else if let Some(stripped) = src.strip_prefix('&') { let stripped = stripped.trim_start(); if !is_mutbl(stripped) { - return (assignment_rhs_span, format!("&mut {stripped}")); + return (true, assignment_rhs_span, format!("&mut {stripped}")); } } } - let highlight_span = match opt_ty_info { + let (suggestability, highlight_span) = match opt_ty_info { // if this is a variable binding with an explicit type, // try to highlight that for the suggestion. - Some(ty_span) => ty_span, + Some(ty_span) => (true, ty_span), // otherwise, just highlight the span associated with // the (MIR) LocalDecl. - None => local_decl.source_info.span, + None => (false, local_decl.source_info.span), }; if let Ok(src) = tcx.sess.source_map().span_to_snippet(highlight_span) @@ -1053,12 +1057,13 @@ fn suggest_ampmut<'tcx>( { let lt_name = &src[1..ws_pos]; let ty = &src[ws_pos..]; - return (highlight_span, format!("&{} mut{}", lt_name, ty)); + return (true, highlight_span, format!("&{} mut{}", lt_name, ty)); } let ty_mut = local_decl.ty.builtin_deref(true).unwrap(); assert_eq!(ty_mut.mutbl, hir::Mutability::Not); ( + suggestability, highlight_span, if local_decl.ty.is_region_ptr() { format!("&mut {}", ty_mut.ty) diff --git a/compiler/rustc_mir_build/src/build/mod.rs b/compiler/rustc_mir_build/src/build/mod.rs index e2399818929..cdacf3ad892 100644 --- a/compiler/rustc_mir_build/src/build/mod.rs +++ b/compiler/rustc_mir_build/src/build/mod.rs @@ -162,7 +162,11 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_ let opt_ty_info; let self_arg; if let Some(ref fn_decl) = tcx.hir().fn_decl_by_hir_id(owner_id) { - opt_ty_info = fn_decl.inputs.get(index).map(|ty| ty.span); + opt_ty_info = fn_decl + .inputs + .get(index) + // Make sure that inferred closure args have no type span + .and_then(|ty| if arg.pat.span != ty.span { Some(ty.span) } else { None }); self_arg = if index == 0 && fn_decl.implicit_self.has_implicit_self() { match fn_decl.implicit_self { hir::ImplicitSelfKind::Imm => Some(ImplicitSelfKind::Imm), |
