1
Fork 0

further update fuzzy_match_tys

This commit is contained in:
lcnr 2022-02-11 16:12:22 +01:00
parent 0efc6c02cb
commit f2aea1ea6e
25 changed files with 111 additions and 66 deletions

View file

@ -40,10 +40,13 @@ use suggestions::InferCtxtExt as _;
pub use rustc_infer::traits::error_reporting::*; pub use rustc_infer::traits::error_reporting::*;
// When outputting impl candidates, prefer showing those that are more similar. // When outputting impl candidates, prefer showing those that are more similar.
//
// We also compare candidates after skipping lifetimes, which has a lower
// priority than exact matches.
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum CandidateSimilarity { pub enum CandidateSimilarity {
Exact, Exact { ignoring_lifetimes: bool },
Fuzzy, Fuzzy { ignoring_lifetimes: bool },
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
@ -1155,7 +1158,12 @@ trait InferCtxtPrivExt<'hir, 'tcx> {
error: &MismatchedProjectionTypes<'tcx>, error: &MismatchedProjectionTypes<'tcx>,
); );
fn fuzzy_match_tys(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> bool; fn fuzzy_match_tys(
&self,
a: Ty<'tcx>,
b: Ty<'tcx>,
ignoring_lifetimes: bool,
) -> Option<CandidateSimilarity>;
fn describe_generator(&self, body_id: hir::BodyId) -> Option<&'static str>; fn describe_generator(&self, body_id: hir::BodyId) -> Option<&'static str>;
@ -1458,24 +1466,32 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
}); });
} }
fn fuzzy_match_tys(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> bool { fn fuzzy_match_tys(
&self,
mut a: Ty<'tcx>,
mut b: Ty<'tcx>,
ignoring_lifetimes: bool,
) -> Option<CandidateSimilarity> {
/// returns the fuzzy category of a given type, or None /// returns the fuzzy category of a given type, or None
/// if the type can be equated to any type. /// if the type can be equated to any type.
fn type_category(t: Ty<'_>) -> Option<u32> { fn type_category(tcx: TyCtxt<'_>, t: Ty<'_>) -> Option<u32> {
match t.kind() { match t.kind() {
ty::Bool => Some(0), ty::Bool => Some(0),
ty::Char => Some(1), ty::Char => Some(1),
ty::Str => Some(2), ty::Str => Some(2),
ty::Int(..) | ty::Uint(..) | ty::Infer(ty::IntVar(..)) => Some(3), ty::Adt(def, _) if tcx.is_diagnostic_item(sym::String, def.did) => Some(2),
ty::Float(..) | ty::Infer(ty::FloatVar(..)) => Some(4), ty::Int(..)
| ty::Uint(..)
| ty::Float(..)
| ty::Infer(ty::IntVar(..) | ty::FloatVar(..)) => Some(4),
ty::Ref(..) | ty::RawPtr(..) => Some(5), ty::Ref(..) | ty::RawPtr(..) => Some(5),
ty::Array(..) | ty::Slice(..) => Some(6), ty::Array(..) | ty::Slice(..) => Some(6),
ty::FnDef(..) | ty::FnPtr(..) => Some(7), ty::FnDef(..) | ty::FnPtr(..) => Some(7),
ty::Dynamic(..) => Some(8), ty::Dynamic(..) => Some(8),
ty::Closure(..) => Some(9), ty::Closure(..) => Some(9),
ty::Tuple(..) => Some(10), ty::Tuple(..) => Some(10),
ty::Projection(..) => Some(11), ty::Param(..) => Some(11),
ty::Param(..) => Some(12), ty::Projection(..) => Some(12),
ty::Opaque(..) => Some(13), ty::Opaque(..) => Some(13),
ty::Never => Some(14), ty::Never => Some(14),
ty::Adt(..) => Some(15), ty::Adt(..) => Some(15),
@ -1497,18 +1513,34 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
} }
}; };
match (type_category(a), type_category(b)) { if !ignoring_lifetimes {
(Some(cat_a), Some(cat_b)) => match (a.kind(), b.kind()) { a = strip_references(a);
(ty::Adt(def_a, _), ty::Adt(def_b, _)) => def_a == def_b, b = strip_references(b);
_ if cat_a == cat_b => true, }
(ty::Ref(..), _) | (_, ty::Ref(..)) => {
self.fuzzy_match_tys(strip_references(a), strip_references(b)) let cat_a = type_category(self.tcx, a)?;
let cat_b = type_category(self.tcx, b)?;
if a == b {
Some(CandidateSimilarity::Exact { ignoring_lifetimes })
} else if cat_a == cat_b {
match (a.kind(), b.kind()) {
(ty::Adt(def_a, _), ty::Adt(def_b, _)) => def_a == def_b,
// Matching on references results in a lot of unhelpful
// suggestions, so let's just not do that for now.
//
// We still upgrade successful matches to `ignoring_lifetimes: true`
// to prioritize that impl.
(ty::Ref(..) | ty::RawPtr(..), ty::Ref(..) | ty::RawPtr(..)) => {
self.fuzzy_match_tys(a, b, true).is_some()
} }
_ => false,
},
// infer and error can be equated to all types
_ => true, _ => true,
} }
.then_some(CandidateSimilarity::Fuzzy { ignoring_lifetimes })
} else if ignoring_lifetimes {
None
} else {
self.fuzzy_match_tys(a, b, true)
}
} }
fn describe_generator(&self, body_id: hir::BodyId) -> Option<&'static str> { fn describe_generator(&self, body_id: hir::BodyId) -> Option<&'static str> {
@ -1533,22 +1565,8 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
let imp = self.tcx.impl_trait_ref(def_id).unwrap(); let imp = self.tcx.impl_trait_ref(def_id).unwrap();
// Check for exact match. self.fuzzy_match_tys(trait_ref.skip_binder().self_ty(), imp.self_ty(), false)
if trait_ref.skip_binder().self_ty() == imp.self_ty() { .map(|similarity| ImplCandidate { trait_ref: imp, similarity })
return Some(ImplCandidate {
trait_ref: imp,
similarity: CandidateSimilarity::Exact,
});
}
if self.fuzzy_match_tys(trait_ref.skip_binder().self_ty(), imp.self_ty()) {
return Some(ImplCandidate {
trait_ref: imp,
similarity: CandidateSimilarity::Fuzzy,
});
}
None
}) })
.collect() .collect()
} }

View file

@ -56,7 +56,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
trait_ref.substs.types().skip(1), trait_ref.substs.types().skip(1),
impl_trait_ref.substs.types().skip(1), impl_trait_ref.substs.types().skip(1),
) )
.all(|(u, v)| self.fuzzy_match_tys(u, v)) .all(|(u, v)| self.fuzzy_match_tys(u, v, false).is_some())
{ {
fuzzy_match_impls.push(def_id); fuzzy_match_impls.push(def_id);
} }

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type U = str; LL | type U = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `X` note: required by a bound in `X`
--> $DIR/hr-associated-type-bound-1.rs:3:33 --> $DIR/hr-associated-type-bound-1.rs:3:33
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type V = str; LL | type V = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `Y` note: required by a bound in `Y`
--> $DIR/hr-associated-type-bound-param-1.rs:4:36 --> $DIR/hr-associated-type-bound-param-1.rs:4:36
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | T: Z<'a, u16>, LL | T: Z<'a, u16>,
| ^^^^^^^^^^ the trait `Clone` is not implemented for `str` | ^^^^^^^^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `Z` note: required by a bound in `Z`
--> $DIR/hr-associated-type-bound-param-2.rs:6:35 --> $DIR/hr-associated-type-bound-param-2.rs:6:35
| |
@ -19,6 +21,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | T: Z<'a, u16>, LL | T: Z<'a, u16>,
| ^^^^^^^^^^ the trait `Clone` is not implemented for `str` | ^^^^^^^^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `Z` note: required by a bound in `Z`
--> $DIR/hr-associated-type-bound-param-2.rs:6:35 --> $DIR/hr-associated-type-bound-param-2.rs:6:35
| |
@ -34,6 +38,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type W = str; LL | type W = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `Z` note: required by a bound in `Z`
--> $DIR/hr-associated-type-bound-param-2.rs:6:35 --> $DIR/hr-associated-type-bound-param-2.rs:6:35
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type U = str; LL | type U = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `X` note: required by a bound in `X`
--> $DIR/hr-associated-type-bound-param-3.rs:4:33 --> $DIR/hr-associated-type-bound-param-3.rs:4:33
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type U = str; LL | type U = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `X` note: required by a bound in `X`
--> $DIR/hr-associated-type-bound-param-4.rs:4:36 --> $DIR/hr-associated-type-bound-param-4.rs:4:36
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type U = str; LL | type U = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `X` note: required by a bound in `X`
--> $DIR/hr-associated-type-bound-param-5.rs:17:45 --> $DIR/hr-associated-type-bound-param-5.rs:17:45
| |
@ -19,6 +21,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | type U = str; LL | type U = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `X` note: required by a bound in `X`
--> $DIR/hr-associated-type-bound-param-5.rs:17:45 --> $DIR/hr-associated-type-bound-param-5.rs:17:45
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `{integer}: Scalar` is not satisfied
LL | b + 3 LL | b + 3
| ^ the trait `Scalar` is not implemented for `{integer}` | ^ the trait `Scalar` is not implemented for `{integer}`
| |
= help: the following implementations were found:
<f64 as Scalar>
note: required because of the requirements on the impl of `Add<{integer}>` for `Bob` note: required because of the requirements on the impl of `Add<{integer}>` for `Bob`
--> $DIR/issue-22645.rs:8:19 --> $DIR/issue-22645.rs:8:19
| |

View file

@ -4,6 +4,9 @@ error[E0277]: the trait bound `f32: Foo` is not satisfied
LL | gimme::<f32>(); LL | gimme::<f32>();
| ^^^ the trait `Foo` is not implemented for `f32` | ^^^ the trait `Foo` is not implemented for `f32`
| |
= help: the following implementations were found:
<i32 as Foo>
<u32 as Foo>
note: required by a bound in `gimme` note: required by a bound in `gimme`
--> $DIR/chalk_initial_program.rs:9:13 --> $DIR/chalk_initial_program.rs:9:13
| |

View file

@ -17,6 +17,8 @@ error[E0277]: the trait bound `f32: Foo` is not satisfied
LL | impl Baz<f32> for f32 { } LL | impl Baz<f32> for f32 { }
| ^^^^^^^^ the trait `Foo` is not implemented for `f32` | ^^^^^^^^ the trait `Foo` is not implemented for `f32`
| |
= help: the following implementations were found:
<i32 as Foo>
note: required by a bound in `Baz` note: required by a bound in `Baz`
--> $DIR/impl_wf.rs:18:31 --> $DIR/impl_wf.rs:18:31
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `f32: Foo` is not satisfied
LL | type Item = f32; LL | type Item = f32;
| ^^^ the trait `Foo` is not implemented for `f32` | ^^^ the trait `Foo` is not implemented for `f32`
| |
= help: the following implementations were found:
<i32 as Foo>
note: required by a bound in `Bar::Item` note: required by a bound in `Bar::Item`
--> $DIR/impl_wf_2.rs:8:16 --> $DIR/impl_wf_2.rs:8:16
| |

View file

@ -6,6 +6,9 @@ LL | only_bar(x);
| | | |
| required by a bound introduced by this call | required by a bound introduced by this call
| |
= help: the following implementations were found:
<i32 as Bar>
<u32 as Bar>
note: required by a bound in `only_bar` note: required by a bound in `only_bar`
--> $DIR/type_inference.rs:12:16 --> $DIR/type_inference.rs:12:16
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `{float}: Foo` is not satisfied
LL | let s = S { LL | let s = S {
| ^ the trait `Foo` is not implemented for `{float}` | ^ the trait `Foo` is not implemented for `{float}`
| |
= help: the following implementations were found:
<i32 as Foo>
note: required by a bound in `S` note: required by a bound in `S`
--> $DIR/type_wf.rs:6:13 --> $DIR/type_wf.rs:6:13
| |

View file

@ -5,11 +5,11 @@ LL | assert_copy::<&'static mut isize>();
| ^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `&'static mut isize` | ^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `&'static mut isize`
| |
= help: the following implementations were found: = help: the following implementations were found:
<&T as Copy> <isize as Copy>
<*const T as Copy> <f32 as Copy>
<*mut T as Copy> <f64 as Copy>
<i128 as Copy> <i128 as Copy>
and 11 others and 10 others
note: required by a bound in `assert_copy` note: required by a bound in `assert_copy`
--> $DIR/kindck-copy.rs:5:18 --> $DIR/kindck-copy.rs:5:18
| |
@ -23,11 +23,11 @@ LL | assert_copy::<&'a mut isize>();
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `&'a mut isize` | ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `&'a mut isize`
| |
= help: the following implementations were found: = help: the following implementations were found:
<&T as Copy> <isize as Copy>
<*const T as Copy> <f32 as Copy>
<*mut T as Copy> <f64 as Copy>
<i128 as Copy> <i128 as Copy>
and 11 others and 10 others
note: required by a bound in `assert_copy` note: required by a bound in `assert_copy`
--> $DIR/kindck-copy.rs:5:18 --> $DIR/kindck-copy.rs:5:18
| |
@ -112,10 +112,6 @@ error[E0277]: the trait bound `&'a mut (dyn Dummy + Send + 'a): Copy` is not sat
LL | assert_copy::<&'a mut (dyn Dummy + Send)>(); LL | assert_copy::<&'a mut (dyn Dummy + Send)>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `&'a mut (dyn Dummy + Send + 'a)` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `&'a mut (dyn Dummy + Send + 'a)`
| |
= help: the following implementations were found:
<&T as Copy>
<*const T as Copy>
<*mut T as Copy>
note: required by a bound in `assert_copy` note: required by a bound in `assert_copy`
--> $DIR/kindck-copy.rs:5:18 --> $DIR/kindck-copy.rs:5:18
| |

View file

@ -14,6 +14,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | default type U = str; LL | default type U = str;
| ^^^ the trait `Clone` is not implemented for `str` | ^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `X::U` note: required by a bound in `X::U`
--> $DIR/default-associated-type-bound-1.rs:8:13 --> $DIR/default-associated-type-bound-1.rs:8:13
| |

View file

@ -7,6 +7,12 @@ LL | foo(String::new());
| required by a bound introduced by this call | required by a bound introduced by this call
| |
= note: to coerce a `String` into a `&str`, use `&*` as a prefix = note: to coerce a `String` into a `&str`, use `&*` as a prefix
= help: the following implementations were found:
<String as From<&String>>
<String as From<&mut str>>
<String as From<&str>>
<String as From<Box<str>>>
and 2 others
= note: required because of the requirements on the impl of `Into<&str>` for `String` = note: required because of the requirements on the impl of `Into<&str>` for `String`
note: required by a bound in `foo` note: required by a bound in `foo`
--> $DIR/into-str.rs:1:31 --> $DIR/into-str.rs:1:31

View file

@ -6,6 +6,8 @@ LL | bar(a);
| | | |
| required by a bound introduced by this call | required by a bound introduced by this call
| |
= help: the following implementations were found:
<&f32 as Tr>
note: required by a bound in `bar` note: required by a bound in `bar`
--> $DIR/issue-84973-negative.rs:5:11 --> $DIR/issue-84973-negative.rs:5:11
| |

View file

@ -6,12 +6,6 @@ LL | let fp = BufWriter::new(fp);
| | | |
| required by a bound introduced by this call | required by a bound introduced by this call
| |
= help: the following implementations were found:
<&'a UnixStream as std::io::Write>
<&ChildStdin as std::io::Write>
<&File as std::io::Write>
<&Sink as std::io::Write>
and 5 others
= note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write` = note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write`
note: required by a bound in `BufWriter::<W>::new` note: required by a bound in `BufWriter::<W>::new`
--> $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL --> $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL
@ -25,12 +19,6 @@ error[E0277]: the trait bound `&dyn std::io::Write: std::io::Write` is not satis
LL | let fp = BufWriter::new(fp); LL | let fp = BufWriter::new(fp);
| ^^^^^^^^^^^^^^^^^^ the trait `std::io::Write` is not implemented for `&dyn std::io::Write` | ^^^^^^^^^^^^^^^^^^ the trait `std::io::Write` is not implemented for `&dyn std::io::Write`
| |
= help: the following implementations were found:
<&'a UnixStream as std::io::Write>
<&ChildStdin as std::io::Write>
<&File as std::io::Write>
<&Sink as std::io::Write>
and 5 others
= note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write` = note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write`
note: required by a bound in `BufWriter` note: required by a bound in `BufWriter`
--> $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL --> $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | f::<dyn X<Y = str>>(); LL | f::<dyn X<Y = str>>();
| ^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `str` | ^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `f` note: required by a bound in `f`
--> $DIR/check-trait-object-bounds-1.rs:7:9 --> $DIR/check-trait-object-bounds-1.rs:7:9
| |

View file

@ -4,6 +4,8 @@ error[E0277]: the trait bound `str: Clone` is not satisfied
LL | f::<dyn X<Y = str>>(); LL | f::<dyn X<Y = str>>();
| ^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `str` | ^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `str`
| |
= help: the following implementations were found:
<String as Clone>
note: required by a bound in `f` note: required by a bound in `f`
--> $DIR/check-trait-object-bounds-4.rs:10:9 --> $DIR/check-trait-object-bounds-4.rs:10:9
| |

View file

@ -44,6 +44,7 @@ LL | opts.get(<String as AsRef<[u8]>>::as_ref(opt));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LL | opts.get(<String as AsRef<str>>::as_ref(opt)); LL | opts.get(<String as AsRef<str>>::as_ref(opt));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
and 4 other candidates
error[E0283]: type annotations needed error[E0283]: type annotations needed
--> $DIR/issue-77982.rs:13:44 --> $DIR/issue-77982.rs:13:44

View file

@ -8,8 +8,6 @@ LL | foo(&baz);
| | help: consider adding dereference here: `&***baz` | | help: consider adding dereference here: `&***baz`
| required by a bound introduced by this call | required by a bound introduced by this call
| |
= help: the following implementations were found:
<&LDM as Happy>
note: required by a bound in `foo` note: required by a bound in `foo`
--> $DIR/multiple-0.rs:30:26 --> $DIR/multiple-0.rs:30:26
| |

View file

@ -6,8 +6,6 @@ LL | foo(&mut baz);
| | | |
| required by a bound introduced by this call | required by a bound introduced by this call
| |
= help: the following implementations were found:
<&mut LDM as Happy>
note: required by a bound in `foo` note: required by a bound in `foo`
--> $DIR/multiple-1.rs:45:26 --> $DIR/multiple-1.rs:45:26
| |

View file

@ -10,9 +10,9 @@ LL | Ok(Err(123_i32)?)
= help: the following implementations were found: = help: the following implementations were found:
<u8 as From<NonZeroU8>> <u8 as From<NonZeroU8>>
<u8 as From<bool>> <u8 as From<bool>>
<i128 as From<NonZeroI128>> <f32 as From<i16>>
<i128 as From<bool>> <f32 as From<i8>>
and 60 others and 71 others
= note: required because of the requirements on the impl of `FromResidual<Result<Infallible, i32>>` for `Result<u64, u8>` = note: required because of the requirements on the impl of `FromResidual<Result<Infallible, i32>>` for `Result<u64, u8>`
error[E0277]: the `?` operator can only be used on `Result`s, not `Option`s, in a function that returns `Result` error[E0277]: the `?` operator can only be used on `Result`s, not `Option`s, in a function that returns `Result`