Rollup merge of #57502 - nikomatsakis:fix-trait-alias-1b, r=nikomatsakis

make trait-aliases work across crates

This is rebase of a small part of @alexreg's PR #55994. It focuses just on the changes that integrate trait aliases properly into crate metadata, excluding the stylistic edits and the trait objects.

The stylistic edits I also rebased and can open a separate PR.

The trait object stuff I found challenging and decided it basically needed to be reimplemented. For now I've excluded it.

Since this is really @alexreg's work (I really just rebased) I am going to make it r=me once it is working.

Fixes #56488.
Fixes #57023.
This commit is contained in:
Mazdak Farrokhzad 2019-01-19 14:21:18 +01:00 committed by GitHub
commit 5272be5b5e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 223 additions and 57 deletions

View file

@ -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() {}

View file

@ -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() {}

View file

@ -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

View file

@ -0,0 +1,3 @@
#![feature(trait_alias)]
pub trait SendSync = Send + Sync;

View file

@ -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]
}

View file

@ -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`.