Skip to content

Commit

Permalink
new trait alias tests
Browse files Browse the repository at this point in the history
Co-authored-by: Alexander Regueiro <alexreg@me.com>
  • Loading branch information
nikomatsakis and Alexander Regueiro committed Jan 10, 2019
1 parent 1336b8e commit b411994
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/test/ui/issues/issue-56488.rs
@@ -0,0 +1,13 @@
// run-pass

#![feature(trait_alias)]

mod alpha {
pub trait A {}
pub trait C = A;
}

#[allow(unused_imports)]
use alpha::C;

fn main() {}
21 changes: 21 additions & 0 deletions src/test/ui/lint/lint-incoherent-auto-trait-objects.rs
@@ -0,0 +1,21 @@
// ignore-tidy-linelength

trait Foo {}

impl Foo for dyn Send {}

impl Foo for dyn Send + Send {}
//~^ ERROR conflicting implementations
//~| hard error

impl Foo for dyn Send + Sync {}

impl Foo for dyn Sync + Send {}
//~^ ERROR conflicting implementations
//~| hard error

impl Foo for dyn Send + Sync + Send {}
//~^ ERROR conflicting implementations
//~| hard error

fn main() {}
39 changes: 39 additions & 0 deletions src/test/ui/lint/lint-incoherent-auto-trait-objects.stderr
@@ -0,0 +1,39 @@
error: conflicting implementations of trait `Foo` for type `(dyn std::marker::Send + 'static)`: (E0119)
--> $DIR/lint-incoherent-auto-trait-objects.rs:7:1
|
LL | impl Foo for dyn Send {}
| --------------------- first implementation here
LL |
LL | impl Foo for dyn Send + Send {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
|
= note: #[deny(order_dependent_trait_objects)] on by default
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #56484 <https://github.com/rust-lang/rust/issues/56484>

error: conflicting implementations of trait `Foo` for type `(dyn std::marker::Send + std::marker::Sync + 'static)`: (E0119)
--> $DIR/lint-incoherent-auto-trait-objects.rs:13:1
|
LL | impl Foo for dyn Send + Sync {}
| ---------------------------- first implementation here
LL |
LL | impl Foo for dyn Sync + Send {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + std::marker::Sync + 'static)`
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #56484 <https://github.com/rust-lang/rust/issues/56484>

error: conflicting implementations of trait `Foo` for type `(dyn std::marker::Send + std::marker::Sync + 'static)`: (E0119)
--> $DIR/lint-incoherent-auto-trait-objects.rs:17:1
|
LL | impl Foo for dyn Sync + Send {}
| ---------------------------- first implementation here
...
LL | impl Foo for dyn Send + Sync + Send {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + std::marker::Sync + 'static)`
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #56484 <https://github.com/rust-lang/rust/issues/56484>

error: aborting due to 3 previous errors

3 changes: 3 additions & 0 deletions src/test/ui/traits/auxiliary/trait_alias.rs
@@ -0,0 +1,3 @@
#![feature(trait_alias)]

pub trait SendSync = Send + Sync;
17 changes: 17 additions & 0 deletions src/test/ui/traits/trait-alias-cross-crate.rs
@@ -0,0 +1,17 @@
// aux-build:trait_alias.rs

#![feature(trait_alias)]

extern crate trait_alias;

use std::rc::Rc;
use trait_alias::SendSync;

fn use_alias<T: SendSync>() {}

fn main() {
use_alias::<u32>();
use_alias::<Rc<u32>>();
//~^ ERROR `std::rc::Rc<u32>` cannot be sent between threads safely [E0277]
//~^^ ERROR `std::rc::Rc<u32>` cannot be shared between threads safely [E0277]
}
29 changes: 29 additions & 0 deletions src/test/ui/traits/trait-alias-cross-crate.stderr
@@ -0,0 +1,29 @@
error[E0277]: `std::rc::Rc<u32>` cannot be sent between threads safely
--> $DIR/trait-alias-cross-crate.rs:14:5
|
LL | use_alias::<Rc<u32>>();
| ^^^^^^^^^^^^^^^^^^^^ `std::rc::Rc<u32>` cannot be sent between threads safely
|
= help: the trait `std::marker::Send` is not implemented for `std::rc::Rc<u32>`
note: required by `use_alias`
--> $DIR/trait-alias-cross-crate.rs:10:1
|
LL | fn use_alias<T: SendSync>() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0277]: `std::rc::Rc<u32>` cannot be shared between threads safely
--> $DIR/trait-alias-cross-crate.rs:14:5
|
LL | use_alias::<Rc<u32>>();
| ^^^^^^^^^^^^^^^^^^^^ `std::rc::Rc<u32>` cannot be shared between threads safely
|
= help: the trait `std::marker::Sync` is not implemented for `std::rc::Rc<u32>`
note: required by `use_alias`
--> $DIR/trait-alias-cross-crate.rs:10:1
|
LL | fn use_alias<T: SendSync>() {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 2 previous errors

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

0 comments on commit b411994

Please sign in to comment.