Don't suggest nonsense suggestions for unconstrained type vars in note_source_of_type_mismatch_constraint
This commit is contained in:
parent
8e47113d71
commit
ac5aa8c1a4
@ -14,7 +14,7 @@ use rustc_middle::ty::adjustment::AllowTwoPhase;
|
|||||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||||
use rustc_middle::ty::fold::BottomUpFolder;
|
use rustc_middle::ty::fold::BottomUpFolder;
|
||||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
use rustc_middle::ty::print::with_no_trimmed_paths;
|
||||||
use rustc_middle::ty::{self, Article, AssocItem, Ty, TypeAndMut, TypeFoldable};
|
use rustc_middle::ty::{self, Article, AssocItem, Ty, TypeAndMut, TypeFoldable, TypeVisitableExt};
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{BytePos, Span, DUMMY_SP};
|
use rustc_span::{BytePos, Span, DUMMY_SP};
|
||||||
use rustc_trait_selection::infer::InferCtxtExt as _;
|
use rustc_trait_selection::infer::InferCtxtExt as _;
|
||||||
@ -504,12 +504,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
// incompatible fix at the original mismatch site.
|
// incompatible fix at the original mismatch site.
|
||||||
if matches!(source, TypeMismatchSource::Ty(_))
|
if matches!(source, TypeMismatchSource::Ty(_))
|
||||||
&& let Some(ideal_method) = ideal_method
|
&& let Some(ideal_method) = ideal_method
|
||||||
|
&& let ideal_arg_ty = self.resolve_vars_if_possible(ideal_method.sig.inputs()[idx + 1])
|
||||||
|
// HACK(compiler-errors): We don't actually consider the implications
|
||||||
|
// of our inference guesses in `emit_type_mismatch_suggestions`, so
|
||||||
|
// only suggest things when we know our type error is precisely due to
|
||||||
|
// a type mismatch, and not via some projection or something. See #116155.
|
||||||
|
&& !ideal_arg_ty.has_non_region_infer()
|
||||||
{
|
{
|
||||||
self.emit_type_mismatch_suggestions(
|
self.emit_type_mismatch_suggestions(
|
||||||
err,
|
err,
|
||||||
arg_expr,
|
arg_expr,
|
||||||
arg_ty,
|
arg_ty,
|
||||||
self.resolve_vars_if_possible(ideal_method.sig.inputs()[idx + 1]),
|
ideal_arg_ty,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
|
17
tests/ui/type/type-check/point-at-inference-issue-116155.rs
Normal file
17
tests/ui/type/type-check/point-at-inference-issue-116155.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
struct S<T>(T);
|
||||||
|
|
||||||
|
impl<T> S<T> {
|
||||||
|
fn new() -> Self {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn constrain<F: Fn() -> T>(&self, _f: F) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let s = S::new();
|
||||||
|
let c = || true;
|
||||||
|
s.constrain(c);
|
||||||
|
let _: S<usize> = s;
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/point-at-inference-issue-116155.rs:15:23
|
||||||
|
|
|
||||||
|
LL | s.constrain(c);
|
||||||
|
| - - this argument has type `{closure@$DIR/point-at-inference-issue-116155.rs:13:13: 13:15}`...
|
||||||
|
| |
|
||||||
|
| ... which causes `s` to have type `S<bool>`
|
||||||
|
LL | let _: S<usize> = s;
|
||||||
|
| -------- ^ expected `S<usize>`, found `S<bool>`
|
||||||
|
| |
|
||||||
|
| expected due to this
|
||||||
|
|
|
||||||
|
= note: expected struct `S<usize>`
|
||||||
|
found struct `S<bool>`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
x
Reference in New Issue
Block a user