implement a hack to make traitobject 0.1.0 compile
This commit is contained in:
parent
7eb444e4f1
commit
0b511b7bd2
15 changed files with 478 additions and 90 deletions
80
src/test/ui/issues/issue-33140-hack-boundaries.rs
Normal file
80
src/test/ui/issues/issue-33140-hack-boundaries.rs
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
#![feature(optin_builtin_traits)]
|
||||
#![allow(order_dependent_trait_objects)]
|
||||
|
||||
// Check that the issue #33140 hack does not allow unintended things.
|
||||
|
||||
// OK
|
||||
trait Trait0 {
|
||||
}
|
||||
|
||||
impl Trait0 for dyn Send {}
|
||||
impl Trait0 for dyn Send {}
|
||||
|
||||
// Problem 1: associated types
|
||||
trait Trait1 {
|
||||
fn my_fn(&self) {}
|
||||
}
|
||||
|
||||
impl Trait1 for dyn Send {}
|
||||
impl Trait1 for dyn Send {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
// Problem 2: negative impl
|
||||
trait Trait2 {
|
||||
}
|
||||
|
||||
impl Trait2 for dyn Send {}
|
||||
impl !Trait2 for dyn Send {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
|
||||
// Problem 3: type parameter
|
||||
trait Trait3<T: ?Sized> {
|
||||
}
|
||||
|
||||
impl Trait3<dyn Sync> for dyn Send {}
|
||||
impl Trait3<dyn Sync> for dyn Send {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
// Problem 4a: not a trait object - generic
|
||||
trait Trait4a {
|
||||
}
|
||||
|
||||
impl<T: ?Sized> Trait4a for T {}
|
||||
impl Trait4a for dyn Send {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
// Problem 4b: not a trait object - misc
|
||||
trait Trait4b {
|
||||
}
|
||||
|
||||
impl Trait4b for () {}
|
||||
impl Trait4b for () {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
// Problem 4c: not a principal-less trait object
|
||||
trait Trait4c {
|
||||
}
|
||||
|
||||
impl Trait4c for dyn Trait1 + Send {}
|
||||
impl Trait4c for dyn Trait1 + Send {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
// Problem 4d: lifetimes
|
||||
trait Trait4d {
|
||||
}
|
||||
|
||||
impl<'a> Trait4d for dyn Send + 'a {}
|
||||
impl<'a> Trait4d for dyn Send + 'a {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
|
||||
// Problem 5: where-clauses
|
||||
trait Trait5 {
|
||||
}
|
||||
|
||||
impl Trait5 for dyn Send {}
|
||||
impl Trait5 for dyn Send where u32: Copy {}
|
||||
//~^ ERROR E0119
|
||||
|
||||
fn main() {}
|
||||
67
src/test/ui/issues/issue-33140-hack-boundaries.stderr
Normal file
67
src/test/ui/issues/issue-33140-hack-boundaries.stderr
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
error[E0119]: conflicting implementations of trait `Trait1` for type `(dyn std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:19:1
|
||||
|
|
||||
LL | impl Trait1 for dyn Send {}
|
||||
| ------------------------ first implementation here
|
||||
LL | impl Trait1 for dyn Send {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait2` for type `(dyn std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:27:1
|
||||
|
|
||||
LL | impl Trait2 for dyn Send {}
|
||||
| ------------------------ first implementation here
|
||||
LL | impl !Trait2 for dyn Send {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait3<(dyn std::marker::Sync + 'static)>` for type `(dyn std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:36:1
|
||||
|
|
||||
LL | impl Trait3<dyn Sync> for dyn Send {}
|
||||
| ---------------------------------- first implementation here
|
||||
LL | impl Trait3<dyn Sync> for dyn Send {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait4a` for type `(dyn std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:44:1
|
||||
|
|
||||
LL | impl<T: ?Sized> Trait4a for T {}
|
||||
| ----------------------------- first implementation here
|
||||
LL | impl Trait4a for dyn Send {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait4b` for type `()`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:52:1
|
||||
|
|
||||
LL | impl Trait4b for () {}
|
||||
| ------------------- first implementation here
|
||||
LL | impl Trait4b for () {}
|
||||
| ^^^^^^^^^^^^^^^^^^^ conflicting implementation for `()`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait4c` for type `(dyn Trait1 + std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:60:1
|
||||
|
|
||||
LL | impl Trait4c for dyn Trait1 + Send {}
|
||||
| ---------------------------------- first implementation here
|
||||
LL | impl Trait4c for dyn Trait1 + Send {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn Trait1 + std::marker::Send + 'static)`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait4d` for type `dyn std::marker::Send`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:68:1
|
||||
|
|
||||
LL | impl<'a> Trait4d for dyn Send + 'a {}
|
||||
| ---------------------------------- first implementation here
|
||||
LL | impl<'a> Trait4d for dyn Send + 'a {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `dyn std::marker::Send`
|
||||
|
||||
error[E0119]: conflicting implementations of trait `Trait5` for type `(dyn std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140-hack-boundaries.rs:77:1
|
||||
|
|
||||
LL | impl Trait5 for dyn Send {}
|
||||
| ------------------------ first implementation here
|
||||
LL | impl Trait5 for dyn Send where u32: Copy {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + 'static)`
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0119`.
|
||||
101
src/test/ui/issues/issue-33140-traitobject-crate.rs
Normal file
101
src/test/ui/issues/issue-33140-traitobject-crate.rs
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
// compile-pass
|
||||
|
||||
#![warn(order_dependent_trait_objects)]
|
||||
|
||||
// Check that traitobject 0.1.0 compiles
|
||||
|
||||
//! # traitobject
|
||||
//!
|
||||
//! Unsafe helpers for working with raw TraitObjects.
|
||||
|
||||
/// A trait implemented for all trait objects.
|
||||
///
|
||||
/// Implementations for all traits in std are provided.
|
||||
pub unsafe trait Trait {}
|
||||
|
||||
unsafe impl Trait for ::std::any::Any + Send { }
|
||||
unsafe impl Trait for ::std::any::Any + Sync { }
|
||||
unsafe impl Trait for ::std::any::Any + Send + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::borrow::Borrow<T> + Send { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::borrow::Borrow<T> + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::borrow::Borrow<T> + Send + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::borrow::BorrowMut<T> + Send { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::borrow::BorrowMut<T> + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::borrow::BorrowMut<T> + Send + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::convert::AsMut<T> + Send { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::convert::AsMut<T> + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::convert::AsMut<T> + Send + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::convert::AsRef<T> + Send { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::convert::AsRef<T> + Sync { }
|
||||
unsafe impl<T: ?Sized> Trait for ::std::convert::AsRef<T> + Send + Sync { }
|
||||
unsafe impl Trait for ::std::error::Error + Send { }
|
||||
unsafe impl Trait for ::std::error::Error + Sync { }
|
||||
unsafe impl Trait for ::std::error::Error + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Binary + Send { }
|
||||
unsafe impl Trait for ::std::fmt::Binary + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Binary + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Debug + Send { }
|
||||
unsafe impl Trait for ::std::fmt::Debug + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Debug + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Display + Send { }
|
||||
unsafe impl Trait for ::std::fmt::Display + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Display + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::LowerExp + Send { }
|
||||
unsafe impl Trait for ::std::fmt::LowerExp + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::LowerExp + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::LowerHex + Send { }
|
||||
unsafe impl Trait for ::std::fmt::LowerHex + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::LowerHex + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Octal + Send { }
|
||||
unsafe impl Trait for ::std::fmt::Octal + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Octal + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Pointer + Send { }
|
||||
unsafe impl Trait for ::std::fmt::Pointer + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Pointer + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::UpperExp + Send { }
|
||||
unsafe impl Trait for ::std::fmt::UpperExp + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::UpperExp + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::UpperHex + Send { }
|
||||
unsafe impl Trait for ::std::fmt::UpperHex + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::UpperHex + Send + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Write + Send { }
|
||||
unsafe impl Trait for ::std::fmt::Write + Sync { }
|
||||
unsafe impl Trait for ::std::fmt::Write + Send + Sync { }
|
||||
unsafe impl Trait for ::std::hash::Hasher + Send { }
|
||||
unsafe impl Trait for ::std::hash::Hasher + Sync { }
|
||||
unsafe impl Trait for ::std::hash::Hasher + Send + Sync { }
|
||||
unsafe impl Trait for ::std::io::BufRead + Send { }
|
||||
unsafe impl Trait for ::std::io::BufRead + Sync { }
|
||||
unsafe impl Trait for ::std::io::BufRead + Send + Sync { }
|
||||
unsafe impl Trait for ::std::io::Read + Send { }
|
||||
unsafe impl Trait for ::std::io::Read + Sync { }
|
||||
unsafe impl Trait for ::std::io::Read + Send + Sync { }
|
||||
unsafe impl Trait for ::std::io::Seek + Send { }
|
||||
unsafe impl Trait for ::std::io::Seek + Sync { }
|
||||
unsafe impl Trait for ::std::io::Seek + Send + Sync { }
|
||||
unsafe impl Trait for ::std::io::Write + Send { }
|
||||
unsafe impl Trait for ::std::io::Write + Sync { }
|
||||
unsafe impl Trait for ::std::io::Write + Send + Sync { }
|
||||
unsafe impl<T, I> Trait for ::std::iter::IntoIterator<IntoIter=I, Item=T> { }
|
||||
unsafe impl<T> Trait for ::std::iter::Iterator<Item=T> + Send { }
|
||||
unsafe impl<T> Trait for ::std::iter::Iterator<Item=T> + Sync { }
|
||||
unsafe impl<T> Trait for ::std::iter::Iterator<Item=T> + Send + Sync { }
|
||||
unsafe impl Trait for ::std::marker::Send + Send { }
|
||||
unsafe impl Trait for ::std::marker::Send + Sync { }
|
||||
unsafe impl Trait for ::std::marker::Send + Send + Sync { }
|
||||
unsafe impl Trait for ::std::marker::Sync + Send { }
|
||||
unsafe impl Trait for ::std::marker::Sync + Sync { }
|
||||
unsafe impl Trait for ::std::marker::Sync + Send + Sync { }
|
||||
unsafe impl Trait for ::std::ops::Drop + Send { }
|
||||
unsafe impl Trait for ::std::ops::Drop + Sync { }
|
||||
unsafe impl Trait for ::std::ops::Drop + Send + Sync { }
|
||||
unsafe impl Trait for ::std::string::ToString + Send { }
|
||||
unsafe impl Trait for ::std::string::ToString + Sync { }
|
||||
unsafe impl Trait for ::std::string::ToString + Send + Sync { }
|
||||
fn assert_trait<T: Trait + ?Sized>() {}
|
||||
|
||||
fn main() {
|
||||
assert_trait::<dyn Send>();
|
||||
assert_trait::<dyn Sync>();
|
||||
assert_trait::<dyn Send + Sync>();
|
||||
}
|
||||
39
src/test/ui/issues/issue-33140-traitobject-crate.stderr
Normal file
39
src/test/ui/issues/issue-33140-traitobject-crate.stderr
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
warning: conflicting implementations of trait `Trait` for type `(dyn std::marker::Sync + std::marker::Send + 'static)`: (E0119)
|
||||
--> $DIR/issue-33140-traitobject-crate.rs:85:1
|
||||
|
|
||||
LL | unsafe impl Trait for ::std::marker::Send + Sync { }
|
||||
| ------------------------------------------------ first implementation here
|
||||
LL | unsafe impl Trait for ::std::marker::Send + Send + Sync { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Sync + std::marker::Send + 'static)`
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/issue-33140-traitobject-crate.rs:3:9
|
||||
|
|
||||
LL | #![warn(order_dependent_trait_objects)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= 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>
|
||||
|
||||
warning: conflicting implementations of trait `Trait` for type `(dyn std::marker::Sync + std::marker::Send + 'static)`: (E0119)
|
||||
--> $DIR/issue-33140-traitobject-crate.rs:86:1
|
||||
|
|
||||
LL | unsafe impl Trait for ::std::marker::Send + Send + Sync { }
|
||||
| ------------------------------------------------------- first implementation here
|
||||
LL | unsafe impl Trait for ::std::marker::Sync + Send { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Sync + std::marker::Send + '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>
|
||||
|
||||
warning: conflicting implementations of trait `Trait` for type `(dyn std::marker::Sync + std::marker::Send + 'static)`: (E0119)
|
||||
--> $DIR/issue-33140-traitobject-crate.rs:88:1
|
||||
|
|
||||
LL | unsafe impl Trait for ::std::marker::Sync + Send { }
|
||||
| ------------------------------------------------ first implementation here
|
||||
LL | unsafe impl Trait for ::std::marker::Sync + Sync { }
|
||||
LL | unsafe impl Trait for ::std::marker::Sync + Send + Sync { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Sync + std::marker::Send + '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>
|
||||
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
#![deny(order_dependent_trait_objects)]
|
||||
|
||||
trait Trait {
|
||||
fn xyz() -> bool;
|
||||
}
|
||||
|
|
@ -10,7 +8,6 @@ impl Trait for dyn Send + Sync {
|
|||
|
||||
impl Trait for dyn Sync + Send {
|
||||
//~^ ERROR conflicting implementations
|
||||
//~| hard error
|
||||
fn xyz() -> bool { true }
|
||||
}
|
||||
|
||||
|
|
@ -24,14 +21,12 @@ impl Trait2 for dyn Send + Sync {
|
|||
|
||||
impl Trait2 for dyn Sync + Send + Sync {
|
||||
//~^ ERROR conflicting implementations
|
||||
//~| hard error
|
||||
fn uvw() -> bool { true }
|
||||
}
|
||||
|
||||
struct Foo<T: ?Sized>(T);
|
||||
impl Foo<dyn Send + Sync> {
|
||||
fn abc() -> bool { //~ ERROR duplicate definitions with name `abc`
|
||||
//~| hard error
|
||||
false
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,25 @@
|
|||
error: conflicting implementations of trait `Trait` for type `(dyn std::marker::Send + std::marker::Sync + 'static)`: (E0119)
|
||||
--> $DIR/issue-33140.rs:11:1
|
||||
error[E0119]: conflicting implementations of trait `Trait` for type `(dyn std::marker::Sync + std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140.rs:9:1
|
||||
|
|
||||
LL | impl Trait for dyn Send + Sync {
|
||||
| ------------------------------ first implementation here
|
||||
...
|
||||
LL | impl Trait for dyn Sync + Send {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Send + std::marker::Sync + 'static)`
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/issue-33140.rs:1:9
|
||||
|
|
||||
LL | #![deny(order_dependent_trait_objects)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= 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>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Sync + std::marker::Send + 'static)`
|
||||
|
||||
error: conflicting implementations of trait `Trait2` for type `(dyn std::marker::Send + std::marker::Sync + 'static)`: (E0119)
|
||||
--> $DIR/issue-33140.rs:25:1
|
||||
error[E0119]: conflicting implementations of trait `Trait2` for type `(dyn std::marker::Sync + std::marker::Send + 'static)`:
|
||||
--> $DIR/issue-33140.rs:22:1
|
||||
|
|
||||
LL | impl Trait2 for dyn Send + Sync {
|
||||
| ------------------------------- first implementation here
|
||||
...
|
||||
LL | impl Trait2 for dyn Sync + Send + Sync {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `(dyn std::marker::Sync + std::marker::Send + 'static)`
|
||||
|
||||
error: duplicate definitions with name `abc` (E0592)
|
||||
--> $DIR/issue-33140.rs:33:5
|
||||
error[E0592]: duplicate definitions with name `abc`
|
||||
--> $DIR/issue-33140.rs:29:5
|
||||
|
|
||||
LL | / fn abc() -> bool { //~ ERROR duplicate definitions with name `abc`
|
||||
LL | | //~| hard error
|
||||
LL | | false
|
||||
LL | | }
|
||||
| |_____^ duplicate definitions for `abc`
|
||||
|
|
@ -40,9 +28,8 @@ LL | / fn abc() -> bool {
|
|||
LL | | true
|
||||
LL | | }
|
||||
| |_____- other definition for `abc`
|
||||
|
|
||||
= 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
|
||||
|
||||
Some errors occurred: E0119, E0592.
|
||||
For more information about an error, try `rustc --explain E0119`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue