Skip to content

Commit

Permalink
Don't allow implementing trait directly on type-alias-impl-trait
Browse files Browse the repository at this point in the history
This is specifically disallowed by the RFC, but we never added a check
for it.

Fixes #76202
  • Loading branch information
Aaron1011 committed Sep 19, 2020
1 parent 59fb88d commit 367efa8
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
8 changes: 8 additions & 0 deletions compiler/rustc_typeck/src/coherence/orphan.rs
Expand Up @@ -230,6 +230,14 @@ impl ItemLikeVisitor<'v> for OrphanChecker<'tcx> {
return;
}
}

if let ty::Opaque(def_id, _) = *trait_ref.self_ty().kind() {
self.tcx
.sess
.struct_span_err(sp, "cannot implement trait on type alias impl trait")
.span_note(self.tcx.def_span(def_id), "type alias impl trait defined here")
.emit();
}
}
}

Expand Down
@@ -0,0 +1,23 @@
// Regression test for issue #76202
// Tests that we don't ICE when we have a trait impl on a TAIT.

#![feature(type_alias_impl_trait)]

trait Dummy {}
impl Dummy for () {}

type F = impl Dummy;
fn f() -> F {}

trait Test {
fn test(self);
}

impl Test for F { //~ ERROR cannot implement trait
fn test(self) {}
}

fn main() {
let x: F = f();
x.test();
}
@@ -0,0 +1,14 @@
error: cannot implement trait on type alias impl trait
--> $DIR/issue-76202-trait-impl-for-tait.rs:16:1
|
LL | impl Test for F {
| ^^^^^^^^^^^^^^^
|
note: type alias impl trait defined here
--> $DIR/issue-76202-trait-impl-for-tait.rs:9:10
|
LL | type F = impl Dummy;
| ^^^^^^^^^^

error: aborting due to previous error

0 comments on commit 367efa8

Please sign in to comment.