Eagerly replace {integer}
/{float}
with i32
/f64
for suggestion
This commit is contained in:
parent
3fe3b89cd5
commit
474626af50
@ -1434,6 +1434,17 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
value.fold_with(&mut r)
|
||||
}
|
||||
|
||||
pub fn resolve_numeric_literals_with_default<T>(&self, value: T) -> T
|
||||
where
|
||||
T: TypeFoldable<'tcx>,
|
||||
{
|
||||
if !value.needs_infer() {
|
||||
return value; // Avoid duplicated subst-folding.
|
||||
}
|
||||
let mut r = InferenceLiteralEraser { infcx: self };
|
||||
value.fold_with(&mut r)
|
||||
}
|
||||
|
||||
/// Returns the first unresolved variable contained in `T`. In the
|
||||
/// process of visiting `T`, this will resolve (where possible)
|
||||
/// type variables in `T`, but it never constructs the final,
|
||||
@ -1785,6 +1796,26 @@ impl<'tcx> TyOrConstInferVar<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Replace `{integer}` with `i32` and `{float}` with `f64`.
|
||||
/// Used only for diagnostics.
|
||||
struct InferenceLiteralEraser<'a, 'tcx> {
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> TypeFolder<'tcx> for InferenceLiteralEraser<'a, 'tcx> {
|
||||
fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
|
||||
self.infcx.tcx
|
||||
}
|
||||
|
||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
match ty.kind() {
|
||||
ty::Infer(ty::IntVar(_) | ty::FreshIntTy(_)) => self.tcx().types.i32,
|
||||
ty::Infer(ty::FloatVar(_) | ty::FreshFloatTy(_)) => self.tcx().types.f64,
|
||||
_ => ty.super_fold_with(self),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ShallowResolver<'a, 'tcx> {
|
||||
infcx: &'a InferCtxt<'a, 'tcx>,
|
||||
}
|
||||
|
@ -521,6 +521,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
can_suggest: bool,
|
||||
fn_id: hir::HirId,
|
||||
) -> bool {
|
||||
let found =
|
||||
self.resolve_numeric_literals_with_default(self.resolve_vars_if_possible(found));
|
||||
// Only suggest changing the return type for methods that
|
||||
// haven't set a return type at all (and aren't `fn main()` or an impl).
|
||||
match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
|
||||
|
@ -36,7 +36,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/issue-66706.rs:2:5
|
||||
|
|
||||
LL | fn a() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> [i32; _]`
|
||||
LL | [0; [|_: _ &_| ()].len()]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found array `[{integer}; _]`
|
||||
|
||||
@ -44,7 +44,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/issue-66706.rs:14:5
|
||||
|
|
||||
LL | fn c() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> [i32; _]`
|
||||
LL | [0; [|&_: _ &_| {}; 0 ].len()]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found array `[{integer}; _]`
|
||||
|
||||
@ -52,7 +52,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/issue-66706.rs:20:5
|
||||
|
|
||||
LL | fn d() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> [i32; _]`
|
||||
LL | [0; match [|f @ &ref _| () ] {} ]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found array `[{integer}; _]`
|
||||
|
||||
|
@ -38,7 +38,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/span-preservation.rs:39:5
|
||||
|
|
||||
LL | extern "C" fn bar() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> i32`
|
||||
LL | 0
|
||||
| ^ expected `()`, found integer
|
||||
|
||||
@ -46,7 +46,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/span-preservation.rs:44:5
|
||||
|
|
||||
LL | extern "C" fn baz() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> i32`
|
||||
LL | 0
|
||||
| ^ expected `()`, found integer
|
||||
|
||||
@ -54,7 +54,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/span-preservation.rs:49:5
|
||||
|
|
||||
LL | extern "Rust" fn rust_abi() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> i32`
|
||||
LL | 0
|
||||
| ^ expected `()`, found integer
|
||||
|
||||
@ -62,7 +62,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/span-preservation.rs:54:5
|
||||
|
|
||||
LL | extern "\x43" fn c_abi_escaped() {
|
||||
| - possibly return type missing here?
|
||||
| - help: try adding a return type: `-> i32`
|
||||
LL | 0
|
||||
| ^ expected `()`, found integer
|
||||
|
||||
|
@ -1,15 +1,19 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/return-type.rs:10:5
|
||||
|
|
||||
LL | fn bar() {
|
||||
| - possibly return type missing here?
|
||||
LL | foo(4 as usize)
|
||||
| ^^^^^^^^^^^^^^^- help: consider using a semicolon here: `;`
|
||||
| |
|
||||
| expected `()`, found struct `S`
|
||||
| ^^^^^^^^^^^^^^^ expected `()`, found struct `S`
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found struct `S<usize>`
|
||||
help: consider using a semicolon here
|
||||
|
|
||||
LL | foo(4 as usize);
|
||||
| +
|
||||
help: try adding a return type
|
||||
|
|
||||
LL | fn bar() -> S<usize> {
|
||||
| +++++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user