Avoid calling item_name for RPITIT
This commit is contained in:
parent
c4c84df3b3
commit
c0c155137b
@ -25,10 +25,12 @@ pub fn report_extra_impl_obligation(
|
|||||||
"impl has stricter requirements than trait"
|
"impl has stricter requirements than trait"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if !self.tcx.is_impl_trait_in_trait(trait_item_def_id) {
|
||||||
if let Some(span) = self.tcx.hir().span_if_local(trait_item_def_id) {
|
if let Some(span) = self.tcx.hir().span_if_local(trait_item_def_id) {
|
||||||
let item_name = self.tcx.item_name(impl_item_def_id.to_def_id());
|
let item_name = self.tcx.item_name(impl_item_def_id.to_def_id());
|
||||||
err.span_label(span, format!("definition of `{}` from trait", item_name));
|
err.span_label(span, format!("definition of `{}` from trait", item_name));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err.span_label(error_span, format!("impl has extra requirement {}", requirement));
|
err.span_label(error_span, format!("impl has extra requirement {}", requirement));
|
||||||
|
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
error[E0726]: implicit elided lifetime not allowed here
|
||||||
|
--> $DIR/return-not-existing-pair.rs:12:20
|
||||||
|
|
|
||||||
|
LL | impl<'a, 'b, T, U> MyTrait<T> for U {
|
||||||
|
| ^^^^^^^^^^ expected lifetime parameters
|
||||||
|
|
|
||||||
|
help: indicate the anonymous lifetimes
|
||||||
|
|
|
||||||
|
LL | impl<'a, 'b, T, U> MyTrait<'_, '_, T> for U {
|
||||||
|
| +++++++
|
||||||
|
|
||||||
|
error[E0412]: cannot find type `ConnImpl` in this scope
|
||||||
|
--> $DIR/return-not-existing-pair.rs:8:48
|
||||||
|
|
|
||||||
|
LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
|
||||||
|
| ^^^^^^^^ not found in this scope
|
||||||
|
|
||||||
|
error[E0186]: method `foo` has a `&self` declaration in the trait, but not in the impl
|
||||||
|
--> $DIR/return-not-existing-pair.rs:14:5
|
||||||
|
|
|
||||||
|
LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
|
||||||
|
| ------------------------------------------------------------ `&self` used in trait
|
||||||
|
...
|
||||||
|
LL | async fn foo(_: T) -> (&'a U, &'b T) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&self` in impl
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/return-not-existing-pair.rs:14:42
|
||||||
|
|
|
||||||
|
LL | async fn foo(_: T) -> (&'a U, &'b T) {}
|
||||||
|
| ^^ expected `(&U, &T)`, found `()`
|
||||||
|
|
|
||||||
|
= note: expected tuple `(&'a U, &'b T)`
|
||||||
|
found unit type `()`
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0186, E0308, E0412, E0726.
|
||||||
|
For more information about an error, try `rustc --explain E0186`.
|
@ -0,0 +1,39 @@
|
|||||||
|
error[E0726]: implicit elided lifetime not allowed here
|
||||||
|
--> $DIR/return-not-existing-pair.rs:12:20
|
||||||
|
|
|
||||||
|
LL | impl<'a, 'b, T, U> MyTrait<T> for U {
|
||||||
|
| ^^^^^^^^^^ expected lifetime parameters
|
||||||
|
|
|
||||||
|
help: indicate the anonymous lifetimes
|
||||||
|
|
|
||||||
|
LL | impl<'a, 'b, T, U> MyTrait<'_, '_, T> for U {
|
||||||
|
| +++++++
|
||||||
|
|
||||||
|
error[E0412]: cannot find type `ConnImpl` in this scope
|
||||||
|
--> $DIR/return-not-existing-pair.rs:8:48
|
||||||
|
|
|
||||||
|
LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
|
||||||
|
| ^^^^^^^^ not found in this scope
|
||||||
|
|
||||||
|
error[E0186]: method `foo` has a `&self` declaration in the trait, but not in the impl
|
||||||
|
--> $DIR/return-not-existing-pair.rs:14:5
|
||||||
|
|
|
||||||
|
LL | async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
|
||||||
|
| ------------------------------------------------------------ `&self` used in trait
|
||||||
|
...
|
||||||
|
LL | async fn foo(_: T) -> (&'a U, &'b T) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&self` in impl
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/return-not-existing-pair.rs:14:42
|
||||||
|
|
|
||||||
|
LL | async fn foo(_: T) -> (&'a U, &'b T) {}
|
||||||
|
| ^^ expected `(&U, &T)`, found `()`
|
||||||
|
|
|
||||||
|
= note: expected tuple `(&'a U, &'b T)`
|
||||||
|
found unit type `()`
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0186, E0308, E0412, E0726.
|
||||||
|
For more information about an error, try `rustc --explain E0186`.
|
19
tests/ui/async-await/in-trait/return-not-existing-pair.rs
Normal file
19
tests/ui/async-await/in-trait/return-not-existing-pair.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// edition:2021
|
||||||
|
// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
|
||||||
|
// revisions: current next
|
||||||
|
|
||||||
|
#![feature(async_fn_in_trait)]
|
||||||
|
|
||||||
|
trait MyTrait<'a, 'b, T> {
|
||||||
|
async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T);
|
||||||
|
//~^ ERROR: cannot find type `ConnImpl` in this scope [E0412]
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, 'b, T, U> MyTrait<T> for U {
|
||||||
|
//~^ ERROR: implicit elided lifetime not allowed here [E0726]
|
||||||
|
async fn foo(_: T) -> (&'a U, &'b T) {}
|
||||||
|
//~^ ERROR: method `foo` has a `&self` declaration in the trait, but not in the impl [E0186]
|
||||||
|
//~| ERROR: mismatched types [E0308]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue
Block a user