diff options
| author | YI <uuuuuu@protonmail.com> | 2020-02-25 18:15:23 +0800 |
|---|---|---|
| committer | YI <uuuuuu@protonmail.com> | 2020-04-08 11:52:29 +0800 |
| commit | 3ae974f025d4376c720e3b2773ccd2c201f098dc (patch) | |
| tree | 79b3145b4cc4942eac197ca3b4a9f72481112f95 /src/test | |
| parent | 39b62533c7f9d0581a6ea9b9fc2cc51f21c3b5b0 (diff) | |
| download | rust-3ae974f025d4376c720e3b2773ccd2c201f098dc.tar.gz rust-3ae974f025d4376c720e3b2773ccd2c201f098dc.zip | |
fix misleading type annotation diagonstics
This solves the method call part of issue https://github.com/rust-lang/rust/issues/69455 I added a `target_span` field so as to pin down the exact location of the error. We need a dedicated field `found_exact_method_call` to prioritize situations like the test case `issue-69455.rs`. If we reuse `found_method_call`, `found_local_pattern` will show up first. We can not move `found_method_call` up, it is undesirable in various situations.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/issues/issue-69455.rs | 30 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-69455.stderr | 17 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-69455.rs b/src/test/ui/issues/issue-69455.rs new file mode 100644 index 00000000000..017654554be --- /dev/null +++ b/src/test/ui/issues/issue-69455.rs @@ -0,0 +1,30 @@ +// Regression test for #69455: projection predicate was not satisfied. +// Compiler should indicate the correct location of the +// unsatisfied projection predicate + +pub trait Test<Rhs = Self> { + type Output; + + fn test(self, rhs: Rhs) -> Self::Output; +} + +impl Test<u32> for u64 { + type Output = u64; + + fn test(self, other: u32) -> u64 { + self + (other as u64) + } +} + +impl Test<u64> for u64 { + type Output = u64; + + fn test(self, other: u64) -> u64 { + (self + other) as u64 + } +} + +fn main() { + let xs: Vec<u64> = vec![1, 2, 3]; + println!("{}", 23u64.test(xs.iter().sum())); //~ ERROR: type annotations needed [E0284] +} diff --git a/src/test/ui/issues/issue-69455.stderr b/src/test/ui/issues/issue-69455.stderr new file mode 100644 index 00000000000..4caa1aca9fd --- /dev/null +++ b/src/test/ui/issues/issue-69455.stderr @@ -0,0 +1,17 @@ +error[E0284]: type annotations needed + --> $DIR/issue-69455.rs:29:26 + | +LL | type Output; + | ------------ `<Self as Test<Rhs>>::Output` defined here +... +LL | println!("{}", 23u64.test(xs.iter().sum())); + | ------^^^^----------------- + | | | + | | cannot infer type for type `u64` + | this method call resolves to `<Self as Test<Rhs>>::Output` + | + = note: cannot satisfy `<u64 as Test<_>>::Output == _` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0284`. |
