Rollup merge of #84014 - estebank:cool-bears-hot-tip, r=varkor
Improve trait/impl method discrepancy errors * Use more accurate spans * Clean up some code by removing previous hack * Provide structured suggestions Structured suggestions are particularly useful for cases where arbitrary self types are used, like in custom `Future`s, because the way to write `self: Pin<&mut Self>` is not necessarily self-evident when first encountered.
This commit is contained in:
commit
c905e9d0ca
17 changed files with 258 additions and 117 deletions
|
@ -36,6 +36,7 @@ pub enum TypeError<'tcx> {
|
|||
UnsafetyMismatch(ExpectedFound<hir::Unsafety>),
|
||||
AbiMismatch(ExpectedFound<abi::Abi>),
|
||||
Mutability,
|
||||
ArgumentMutability(usize),
|
||||
TupleSize(ExpectedFound<usize>),
|
||||
FixedArraySize(ExpectedFound<u64>),
|
||||
ArgCount,
|
||||
|
@ -46,6 +47,7 @@ pub enum TypeError<'tcx> {
|
|||
RegionsPlaceholderMismatch,
|
||||
|
||||
Sorts(ExpectedFound<Ty<'tcx>>),
|
||||
ArgumentSorts(ExpectedFound<Ty<'tcx>>, usize),
|
||||
IntMismatch(ExpectedFound<ty::IntVarValue>),
|
||||
FloatMismatch(ExpectedFound<ty::FloatTy>),
|
||||
Traits(ExpectedFound<DefId>),
|
||||
|
@ -110,7 +112,7 @@ impl<'tcx> fmt::Display for TypeError<'tcx> {
|
|||
AbiMismatch(values) => {
|
||||
write!(f, "expected {} fn, found {} fn", values.expected, values.found)
|
||||
}
|
||||
Mutability => write!(f, "types differ in mutability"),
|
||||
ArgumentMutability(_) | Mutability => write!(f, "types differ in mutability"),
|
||||
TupleSize(values) => write!(
|
||||
f,
|
||||
"expected a tuple with {} element{}, \
|
||||
|
@ -142,7 +144,7 @@ impl<'tcx> fmt::Display for TypeError<'tcx> {
|
|||
br_string(br)
|
||||
),
|
||||
RegionsPlaceholderMismatch => write!(f, "one type is more general than the other"),
|
||||
Sorts(values) => ty::tls::with(|tcx| {
|
||||
ArgumentSorts(values, _) | Sorts(values) => ty::tls::with(|tcx| {
|
||||
report_maybe_different(
|
||||
f,
|
||||
&values.expected.sort_string(tcx),
|
||||
|
@ -199,10 +201,11 @@ impl<'tcx> TypeError<'tcx> {
|
|||
use self::TypeError::*;
|
||||
match self {
|
||||
CyclicTy(_) | CyclicConst(_) | UnsafetyMismatch(_) | Mismatch | AbiMismatch(_)
|
||||
| FixedArraySize(_) | Sorts(_) | IntMismatch(_) | FloatMismatch(_)
|
||||
| VariadicMismatch(_) | TargetFeatureCast(_) => false,
|
||||
| FixedArraySize(_) | ArgumentSorts(..) | Sorts(_) | IntMismatch(_)
|
||||
| FloatMismatch(_) | VariadicMismatch(_) | TargetFeatureCast(_) => false,
|
||||
|
||||
Mutability
|
||||
| ArgumentMutability(_)
|
||||
| TupleSize(_)
|
||||
| ArgCount
|
||||
| RegionsDoesNotOutlive(..)
|
||||
|
@ -339,7 +342,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
use self::TypeError::*;
|
||||
debug!("note_and_explain_type_err err={:?} cause={:?}", err, cause);
|
||||
match err {
|
||||
Sorts(values) => {
|
||||
ArgumentSorts(values, _) | Sorts(values) => {
|
||||
match (values.expected.kind(), values.found.kind()) {
|
||||
(ty::Closure(..), ty::Closure(..)) => {
|
||||
db.note("no two closures, even if identical, have the same type");
|
||||
|
|
|
@ -179,6 +179,12 @@ impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> {
|
|||
} else {
|
||||
relation.relate_with_variance(ty::Contravariant, a, b)
|
||||
}
|
||||
})
|
||||
.enumerate()
|
||||
.map(|(i, r)| match r {
|
||||
Err(TypeError::Sorts(exp_found)) => Err(TypeError::ArgumentSorts(exp_found, i)),
|
||||
Err(TypeError::Mutability) => Err(TypeError::ArgumentMutability(i)),
|
||||
r => r,
|
||||
});
|
||||
Ok(ty::FnSig {
|
||||
inputs_and_output: tcx.mk_type_list(inputs_and_output)?,
|
||||
|
|
|
@ -587,6 +587,7 @@ impl<'a, 'tcx> Lift<'tcx> for ty::error::TypeError<'a> {
|
|||
UnsafetyMismatch(x) => UnsafetyMismatch(x),
|
||||
AbiMismatch(x) => AbiMismatch(x),
|
||||
Mutability => Mutability,
|
||||
ArgumentMutability(i) => ArgumentMutability(i),
|
||||
TupleSize(x) => TupleSize(x),
|
||||
FixedArraySize(x) => FixedArraySize(x),
|
||||
ArgCount => ArgCount,
|
||||
|
@ -607,6 +608,7 @@ impl<'a, 'tcx> Lift<'tcx> for ty::error::TypeError<'a> {
|
|||
CyclicTy(t) => return tcx.lift(t).map(|t| CyclicTy(t)),
|
||||
CyclicConst(ct) => return tcx.lift(ct).map(|ct| CyclicConst(ct)),
|
||||
ProjectionMismatched(x) => ProjectionMismatched(x),
|
||||
ArgumentSorts(x, i) => return tcx.lift(x).map(|x| ArgumentSorts(x, i)),
|
||||
Sorts(x) => return tcx.lift(x).map(Sorts),
|
||||
ExistentialMismatch(x) => return tcx.lift(x).map(ExistentialMismatch),
|
||||
ConstMismatch(x) => return tcx.lift(x).map(ConstMismatch),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue