Rollup merge of #127596 - tesuji:help-unwrap-or, r=compiler-errors
More suggestion for converting `Option<&Vec<T>>` to `Option<&[T]>` Please review commit-by-commit.
This commit is contained in:
commit
83d1a1b252
3 changed files with 61 additions and 15 deletions
|
@ -466,21 +466,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
borrow_removal_span,
|
borrow_removal_span,
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
} else if let Some((deref_ty, _)) =
|
} else if let ty::Ref(_, peeled_found_ty, _) = found_ty_inner.kind()
|
||||||
self.autoderef(expr.span, found_ty_inner).silence_errors().nth(1)
|
&& let ty::Adt(adt, _) = peeled_found_ty.peel_refs().kind()
|
||||||
&& self.can_eq(self.param_env, deref_ty, peeled)
|
|
||||||
&& error_tys_equate_as_ref
|
|
||||||
{
|
|
||||||
let sugg = prefix_wrap(".as_deref()");
|
|
||||||
err.subdiagnostic(errors::SuggestConvertViaMethod {
|
|
||||||
span: expr.span.shrink_to_hi(),
|
|
||||||
sugg,
|
|
||||||
expected,
|
|
||||||
found,
|
|
||||||
borrow_removal_span,
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
} else if let ty::Adt(adt, _) = found_ty_inner.peel_refs().kind()
|
|
||||||
&& self.tcx.is_lang_item(adt.did(), LangItem::String)
|
&& self.tcx.is_lang_item(adt.did(), LangItem::String)
|
||||||
&& peeled.is_str()
|
&& peeled.is_str()
|
||||||
// `Result::map`, conversely, does not take ref of the error type.
|
// `Result::map`, conversely, does not take ref of the error type.
|
||||||
|
@ -496,12 +483,47 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
if !error_tys_equate_as_ref {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
let mut steps = self.autoderef(expr.span, found_ty_inner).silence_errors();
|
||||||
|
if let Some((deref_ty, _)) = steps.nth(1)
|
||||||
|
&& self.can_eq(self.param_env, deref_ty, peeled)
|
||||||
|
{
|
||||||
|
let sugg = prefix_wrap(".as_deref()");
|
||||||
|
err.subdiagnostic(errors::SuggestConvertViaMethod {
|
||||||
|
span: expr.span.shrink_to_hi(),
|
||||||
|
sugg,
|
||||||
|
expected,
|
||||||
|
found,
|
||||||
|
borrow_removal_span,
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (deref_ty, n_step) in steps {
|
||||||
|
if self.can_eq(self.param_env, deref_ty, peeled) {
|
||||||
|
let explicit_deref = "*".repeat(n_step);
|
||||||
|
let sugg = prefix_wrap(&format!(".map(|v| &{explicit_deref}v)"));
|
||||||
|
err.subdiagnostic(errors::SuggestConvertViaMethod {
|
||||||
|
span: expr.span.shrink_to_hi(),
|
||||||
|
sugg,
|
||||||
|
expected,
|
||||||
|
found,
|
||||||
|
borrow_removal_span,
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If `ty` is `Option<T>`, returns `T, T, None`.
|
||||||
|
/// If `ty` is `Result<T, E>`, returns `T, T, Some(E, E)`.
|
||||||
|
/// Otherwise, returns `None`.
|
||||||
fn deconstruct_option_or_result(
|
fn deconstruct_option_or_result(
|
||||||
&self,
|
&self,
|
||||||
found_ty: Ty<'tcx>,
|
found_ty: Ty<'tcx>,
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/127545>.
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
pub fn foo(arg: Option<&Vec<i32>>) -> Option<&[i32]> {
|
||||||
|
arg //~ ERROR 5:5: 5:8: mismatched types [E0308]
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/transforming-option-ref-issue-127545.rs:5:5
|
||||||
|
|
|
||||||
|
LL | pub fn foo(arg: Option<&Vec<i32>>) -> Option<&[i32]> {
|
||||||
|
| -------------- expected `Option<&[i32]>` because of return type
|
||||||
|
LL | arg
|
||||||
|
| ^^^ expected `Option<&[i32]>`, found `Option<&Vec<i32>>`
|
||||||
|
|
|
||||||
|
= note: expected enum `Option<&[i32]>`
|
||||||
|
found enum `Option<&Vec<i32>>`
|
||||||
|
help: try using `.map(|v| &**v)` to convert `Option<&Vec<i32>>` to `Option<&[i32]>`
|
||||||
|
|
|
||||||
|
LL | arg.map(|v| &**v)
|
||||||
|
| ++++++++++++++
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue