47 lines
1.5 KiB
Rust
47 lines
1.5 KiB
Rust
//@ run-pass
|
|
|
|
#![allow(unused_assignments)]
|
|
|
|
// Test that duplicate auto trait bounds in trait objects don't create new types.
|
|
#[allow(unused_assignments)]
|
|
use std::marker::Send as SendAlias;
|
|
|
|
// A dummy trait for the non-auto trait.
|
|
trait Trait {}
|
|
|
|
// A dummy struct to implement `Trait` and `Send`.
|
|
struct Struct;
|
|
|
|
impl Trait for Struct {}
|
|
|
|
// These three functions should be equivalent.
|
|
fn takes_dyn_trait_send(_: Box<dyn Trait + Send>) {}
|
|
fn takes_dyn_trait_send_send(_: Box<dyn Trait + Send + Send>) {}
|
|
fn takes_dyn_trait_send_sendalias(_: Box<dyn Trait + Send + SendAlias>) {}
|
|
|
|
impl dyn Trait + Send + Send {
|
|
fn do_nothing(&self) {}
|
|
}
|
|
|
|
fn main() {
|
|
// 1. Moving into a variable with more `Send`s and back.
|
|
let mut dyn_trait_send = Box::new(Struct) as Box<dyn Trait + Send>;
|
|
let dyn_trait_send_send: Box<dyn Trait + Send + Send> = dyn_trait_send;
|
|
dyn_trait_send = dyn_trait_send_send;
|
|
|
|
// 2. Calling methods with different number of `Send`s.
|
|
let dyn_trait_send = Box::new(Struct) as Box<dyn Trait + Send>;
|
|
takes_dyn_trait_send_send(dyn_trait_send);
|
|
|
|
let dyn_trait_send_send = Box::new(Struct) as Box<dyn Trait + Send + Send>;
|
|
takes_dyn_trait_send(dyn_trait_send_send);
|
|
|
|
// 3. Aliases to the trait are transparent.
|
|
let dyn_trait_send = Box::new(Struct) as Box<dyn Trait + Send>;
|
|
takes_dyn_trait_send_sendalias(dyn_trait_send);
|
|
|
|
// 4. Calling an impl that duplicates an auto trait.
|
|
let dyn_trait_send = Box::new(Struct) as Box<dyn Trait + Send>;
|
|
dyn_trait_send.do_nothing();
|
|
}
|