mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
Calculate ProjectionTy::trait_def_id correctly
This commit is contained in:
parent
89e4e1f1b3
commit
79c665b2a3
@ -1133,9 +1133,13 @@ pub struct ProjectionTy<'tcx> {
|
||||
|
||||
impl<'tcx> ProjectionTy<'tcx> {
|
||||
pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId {
|
||||
let parent = tcx.parent(self.item_def_id);
|
||||
assert_eq!(tcx.def_kind(parent), DefKind::Trait);
|
||||
parent
|
||||
match tcx.def_kind(self.item_def_id) {
|
||||
DefKind::AssocTy | DefKind::AssocConst => tcx.parent(self.item_def_id),
|
||||
DefKind::ImplTraitPlaceholder => {
|
||||
tcx.parent(tcx.impl_trait_in_trait_parent(self.item_def_id))
|
||||
}
|
||||
kind => bug!("unexpected DefKind in ProjectionTy: {kind:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Extracts the underlying trait reference and own substs from this projection.
|
||||
|
30
src/test/ui/impl-trait/in-trait/issue-102140.rs
Normal file
30
src/test/ui/impl-trait/in-trait/issue-102140.rs
Normal file
@ -0,0 +1,30 @@
|
||||
#![feature(return_position_impl_trait_in_trait)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait Marker {}
|
||||
impl Marker for u32 {}
|
||||
|
||||
trait MyTrait {
|
||||
fn foo(&self) -> impl Marker
|
||||
where
|
||||
Self: Sized;
|
||||
}
|
||||
|
||||
struct Outer;
|
||||
|
||||
impl MyTrait for Outer {
|
||||
fn foo(&self) -> impl Marker {
|
||||
42
|
||||
}
|
||||
}
|
||||
|
||||
impl dyn MyTrait {
|
||||
fn other(&self) -> impl Marker {
|
||||
MyTrait::foo(&self)
|
||||
//~^ ERROR the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
//~| ERROR the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
//~| ERROR the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
29
src/test/ui/impl-trait/in-trait/issue-102140.stderr
Normal file
29
src/test/ui/impl-trait/in-trait/issue-102140.stderr
Normal file
@ -0,0 +1,29 @@
|
||||
error[E0277]: the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
--> $DIR/issue-102140.rs:23:22
|
||||
|
|
||||
LL | MyTrait::foo(&self)
|
||||
| ------------ -^^^^
|
||||
| | |
|
||||
| | the trait `MyTrait` is not implemented for `&dyn MyTrait`
|
||||
| | help: consider removing the leading `&`-reference
|
||||
| required by a bound introduced by this call
|
||||
|
||||
error[E0277]: the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
--> $DIR/issue-102140.rs:23:9
|
||||
|
|
||||
LL | MyTrait::foo(&self)
|
||||
| ^^^^^^^^^^^^^^^^^^^ the trait `MyTrait` is not implemented for `&dyn MyTrait`
|
||||
|
|
||||
= help: the trait `MyTrait` is implemented for `Outer`
|
||||
|
||||
error[E0277]: the trait bound `&dyn MyTrait: MyTrait` is not satisfied
|
||||
--> $DIR/issue-102140.rs:23:9
|
||||
|
|
||||
LL | MyTrait::foo(&self)
|
||||
| ^^^^^^^^^^^^ the trait `MyTrait` is not implemented for `&dyn MyTrait`
|
||||
|
|
||||
= help: the trait `MyTrait` is implemented for `Outer`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue
Block a user