diff options
| author | Sean McArthur <sean@seanmonstar.com> | 2019-03-11 16:39:40 -0700 |
|---|---|---|
| committer | Sean McArthur <sean@seanmonstar.com> | 2019-03-12 14:42:10 -0700 |
| commit | df05fbf006e90ed4827c385eb9192e4c46de70f4 (patch) | |
| tree | 259d9c0770a65e17f26ef7b1e7d5642b817a5b43 | |
| parent | e68bf8ae15ee6c052d0bcc9252386c5c5ee86de2 (diff) | |
| download | rust-df05fbf006e90ed4827c385eb9192e4c46de70f4.tar.gz rust-df05fbf006e90ed4827c385eb9192e4c46de70f4.zip | |
rustc: fix ICE when trait alias has bare Self
| -rw-r--r-- | src/librustc/hir/map/mod.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-59029-1.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-59029-1.stderr | 9 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-59029-2.rs | 8 |
4 files changed, 29 insertions, 2 deletions
diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index 86b6805cc9b..0e83ce009c9 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -541,7 +541,8 @@ impl<'hir> Map<'hir> { pub fn ty_param_owner(&self, id: HirId) -> HirId { match self.get_by_hir_id(id) { - Node::Item(&Item { node: ItemKind::Trait(..), .. }) => id, + Node::Item(&Item { node: ItemKind::Trait(..), .. }) | + Node::Item(&Item { node: ItemKind::TraitAlias(..), .. }) => id, Node::GenericParam(_) => self.get_parent_node_by_hir_id(id), _ => bug!("ty_param_owner: {} not a type parameter", self.hir_to_string(id)) } @@ -549,7 +550,8 @@ impl<'hir> Map<'hir> { pub fn ty_param_name(&self, id: HirId) -> Name { match self.get_by_hir_id(id) { - Node::Item(&Item { node: ItemKind::Trait(..), .. }) => keywords::SelfUpper.name(), + Node::Item(&Item { node: ItemKind::Trait(..), .. }) | + Node::Item(&Item { node: ItemKind::TraitAlias(..), .. }) => keywords::SelfUpper.name(), Node::GenericParam(param) => param.name.ident().name, _ => bug!("ty_param_name: {} not a type parameter", self.hir_to_string(id)), } diff --git a/src/test/ui/issues/issue-59029-1.rs b/src/test/ui/issues/issue-59029-1.rs new file mode 100644 index 00000000000..e98a4d0e491 --- /dev/null +++ b/src/test/ui/issues/issue-59029-1.rs @@ -0,0 +1,8 @@ +#![feature(trait_alias)] + +trait Svc<Req> { type Res; } + +trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>; +//~^ ERROR associated type `Res` not found for `Self` + +fn main() {} diff --git a/src/test/ui/issues/issue-59029-1.stderr b/src/test/ui/issues/issue-59029-1.stderr new file mode 100644 index 00000000000..ed1d98c40d1 --- /dev/null +++ b/src/test/ui/issues/issue-59029-1.stderr @@ -0,0 +1,9 @@ +error[E0220]: associated type `Res` not found for `Self` + --> $DIR/issue-59029-1.rs:5:46 + | +LL | trait MkSvc<Target, Req> = Svc<Target> where Self::Res: Svc<Req>; + | ^^^^^^^^^ associated type `Res` not found + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0220`. diff --git a/src/test/ui/issues/issue-59029-2.rs b/src/test/ui/issues/issue-59029-2.rs new file mode 100644 index 00000000000..2bdb128d8c4 --- /dev/null +++ b/src/test/ui/issues/issue-59029-2.rs @@ -0,0 +1,8 @@ +// run-pass +#![feature(trait_alias)] + +trait Svc<Req> { type Res; } + +trait MkSvc<Target, Req> = Svc<Target> where <Self as Svc<Target>>::Res: Svc<Req>; + +fn main() {} |
