diff options
Diffstat (limited to 'tests/ui/traits/object/auto-dedup.rs')
-rw-r--r-- | tests/ui/traits/object/auto-dedup.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/ui/traits/object/auto-dedup.rs b/tests/ui/traits/object/auto-dedup.rs new file mode 100644 index 000000000..39d25eb7f --- /dev/null +++ b/tests/ui/traits/object/auto-dedup.rs @@ -0,0 +1,46 @@ +// 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(); +} |