Skip to content

Commit

Permalink
Add additional tests for type alias impl trait coherence
Browse files Browse the repository at this point in the history
  • Loading branch information
Aaron1011 committed Sep 24, 2019
1 parent 33e1dd7 commit 61cfe92
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 0 deletions.
23 changes: 23 additions & 0 deletions src/test/ui/impl-trait/auto-trait.rs
@@ -0,0 +1,23 @@
// Tests that type alias impls traits do not leak auto-traits for
// the purposes of coherence checking
#![feature(type_alias_impl_trait)]

trait OpaqueTrait { }
impl<T> OpaqueTrait for T { }
type OpaqueType = impl OpaqueTrait;
fn mk_opaque() -> OpaqueType { () }

#[derive(Debug)]
struct D<T>(T);

trait AnotherTrait { }
impl<T: Send> AnotherTrait for T { }

// This is in error, because we cannot assume that `OpaqueType: !Send`.
// (We treat opaque types as "foreign types" that could grow more impls
// in the future.)
impl AnotherTrait for D<OpaqueType> {
//~^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
}

fn main() {}
12 changes: 12 additions & 0 deletions src/test/ui/impl-trait/auto-trait.stderr
@@ -0,0 +1,12 @@
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`:
--> $DIR/auto-trait.rs:19:1
|
LL | impl<T: Send> AnotherTrait for T { }
| -------------------------------- first implementation here
...
LL | impl AnotherTrait for D<OpaqueType> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0119`.
22 changes: 22 additions & 0 deletions src/test/ui/impl-trait/negative-reasoning.rs
@@ -0,0 +1,22 @@
// Tests that we cannot assume that an opaque type does *not* implement some
// other trait
#![feature(type_alias_impl_trait)]

trait OpaqueTrait { }
impl<T> OpaqueTrait for T { }
type OpaqueType = impl OpaqueTrait;
fn mk_opaque() -> OpaqueType { () }

#[derive(Debug)]
struct D<T>(T);

trait AnotherTrait { }
impl<T: std::fmt::Debug> AnotherTrait for T { }


// This is in error, because we cannot assume that `OpaqueType: !Debug`
impl AnotherTrait for D<OpaqueType> {
//~^ ERROR conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
}

fn main() {}
14 changes: 14 additions & 0 deletions src/test/ui/impl-trait/negative-reasoning.stderr
@@ -0,0 +1,14 @@
error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`:
--> $DIR/negative-reasoning.rs:18:1
|
LL | impl<T: std::fmt::Debug> AnotherTrait for T { }
| ------------------------------------------- first implementation here
...
LL | impl AnotherTrait for D<OpaqueType> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
|
= note: upstream crates may add a new impl of trait `std::fmt::Debug` for type `OpaqueType` in future versions

error: aborting due to previous error

For more information about this error, try `rustc --explain E0119`.

0 comments on commit 61cfe92

Please sign in to comment.