forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#51276 - Havvy:dyn-trait-send-send, r=nikoma…
…tsakis Dedup auto traits in trait objects. Fixes rust-lang#47010 Note that the test file `run-pass/trait-object-auto-dedup.rs` passes before and after this change. It's the `ui` test that changed from compiling to not compiling. Which does make this a breaking change, but I cannot imagine anybody actually being broken by it.
- Loading branch information
Showing
4 changed files
with
101 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// 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, Send, and . | ||
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 Sends 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 Sends. | ||
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(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// Checks to make sure that `dyn Trait + Send` and `dyn Trait + Send + Send` are the same type. | ||
// Issue: #47010 | ||
|
||
struct Struct; | ||
impl Trait for Struct {} | ||
trait Trait {} | ||
|
||
type Send1 = Trait + Send; | ||
type Send2 = Trait + Send + Send; | ||
|
||
fn main () {} | ||
|
||
impl Trait + Send { | ||
fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test` | ||
} | ||
|
||
impl Trait + Send + Send { | ||
fn test(&self) { println!("two"); } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
error[E0592]: duplicate definitions with name `test` | ||
--> $DIR/trait-object-auto-dedup-in-impl.rs:24:5 | ||
| | ||
LL | fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test` | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ duplicate definitions for `test` | ||
... | ||
LL | fn test(&self) { println!("two"); } | ||
| ----------------------------------- other definition for `test` | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0592`. |