Skip to content

Commit 95d5ecf

Browse files
committed
Fix associated bound suggestion span issue
1 parent e4fdb55 commit 95d5ecf

4 files changed

Lines changed: 105 additions & 1 deletion

File tree

compiler/rustc_trait_selection/src/error_reporting/infer/note_and_explain.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,13 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
105105
if !sp.contains(p_span) {
106106
diag.span_label(p_span, format!("{expected}this type parameter"));
107107
}
108-
let parent = p_def_id.as_local().and_then(|id| {
108+
let param_def_id = match *proj.self_ty().kind() {
109+
ty::Param(param) => {
110+
tcx.generics_of(body_owner_def_id).type_param(param, tcx).def_id
111+
}
112+
_ => p_def_id,
113+
};
114+
let parent = param_def_id.as_local().and_then(|id| {
109115
let local_id = tcx.local_def_id_to_hir_id(id);
110116
let generics = tcx.parent_hir_node(local_id).generics()?;
111117
Some((id, generics))
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//@ run-rustfix
2+
3+
#![allow(dead_code)]
4+
5+
use std::marker::PhantomData;
6+
7+
trait Visitor<'de> {
8+
type Value;
9+
}
10+
11+
trait Deserializer<'de> {
12+
type Error;
13+
14+
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
15+
where
16+
V: Visitor<'de>;
17+
}
18+
19+
struct Wrapper<'de, T, E>(Result<T, E>, PhantomData<&'de ()>);
20+
21+
impl<'de, T, E> Deserializer<'de> for Wrapper<'de, T, E>
22+
where
23+
T: Deserializer<'de, Error = E>,
24+
{
25+
type Error = E;
26+
27+
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
28+
where
29+
V: Visitor<'de>,
30+
{
31+
match self.0 {
32+
Ok(deserializer) => deserializer.deserialize_ignored_any(visitor), //~ ERROR mismatched types
33+
Err(error) => Err(error),
34+
}
35+
}
36+
}
37+
38+
fn main() {}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//@ run-rustfix
2+
3+
#![allow(dead_code)]
4+
5+
use std::marker::PhantomData;
6+
7+
trait Visitor<'de> {
8+
type Value;
9+
}
10+
11+
trait Deserializer<'de> {
12+
type Error;
13+
14+
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
15+
where
16+
V: Visitor<'de>;
17+
}
18+
19+
struct Wrapper<'de, T, E>(Result<T, E>, PhantomData<&'de ()>);
20+
21+
impl<'de, T, E> Deserializer<'de> for Wrapper<'de, T, E>
22+
where
23+
T: Deserializer<'de>,
24+
{
25+
type Error = E;
26+
27+
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
28+
where
29+
V: Visitor<'de>,
30+
{
31+
match self.0 {
32+
Ok(deserializer) => deserializer.deserialize_ignored_any(visitor), //~ ERROR mismatched types
33+
Err(error) => Err(error),
34+
}
35+
}
36+
}
37+
38+
fn main() {}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/associated-error-bound-issue-145586.rs:32:33
3+
|
4+
LL | impl<'de, T, E> Deserializer<'de> for Wrapper<'de, T, E>
5+
| - expected this type parameter
6+
...
7+
LL | fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
8+
| ----------------------------- expected `Result<<V as Visitor<'de>>::Value, E>` because of return type
9+
...
10+
LL | Ok(deserializer) => deserializer.deserialize_ignored_any(visitor),
11+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Result<<V as Visitor<'_>>::Value, E>`, found `Result<<V as Visitor<'_>>::Value, ...>`
12+
|
13+
= note: expected enum `Result<_, E>`
14+
found enum `Result<_, <T as Deserializer<'de>>::Error>`
15+
help: consider further restricting this bound
16+
|
17+
LL | T: Deserializer<'de, Error = E>,
18+
| +++++++++++
19+
20+
error: aborting due to 1 previous error
21+
22+
For more information about this error, try `rustc --explain E0308`.

0 commit comments

Comments
 (0)