fix(rustup): rustc 1.0.0-nightly (ea8b82e90)
This commit fixes `cargo build` and `cargo test`. Method lookup on traits seems to have changed to force `impl TraitName` expressions to be more specific. That means that `method` will not be found anymore on an object of type `&Trait+Send`, unless you provide an `impl Trait+Send`. Now `NetworkStream` and `HeaderFormat` trait implementations are done against `* + Send`, which helps the compiler to find the respective `downcast*` method implementations once again.
This commit is contained in:
@@ -75,7 +75,7 @@ impl<T: HeaderFormat + Send + Sync + Clone> HeaderClone for T {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HeaderFormat {
|
impl HeaderFormat + Send + Sync {
|
||||||
#[inline]
|
#[inline]
|
||||||
unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
|
unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
|
||||||
mem::transmute(mem::transmute::<&HeaderFormat, raw::TraitObject>(self).data)
|
mem::transmute(mem::transmute::<&HeaderFormat, raw::TraitObject>(self).data)
|
||||||
|
|||||||
12
src/net.rs
12
src/net.rs
@@ -97,7 +97,7 @@ impl Clone for Box<NetworkStream + Send> {
|
|||||||
fn clone(&self) -> Box<NetworkStream + Send> { self.clone_box() }
|
fn clone(&self) -> Box<NetworkStream + Send> { self.clone_box() }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NetworkStream {
|
impl NetworkStream + Send {
|
||||||
unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
|
unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
|
||||||
mem::transmute(mem::transmute::<&NetworkStream,
|
mem::transmute(mem::transmute::<&NetworkStream,
|
||||||
raw::TraitObject>(self).data)
|
raw::TraitObject>(self).data)
|
||||||
@@ -108,13 +108,13 @@ impl NetworkStream {
|
|||||||
raw::TraitObject>(self).data)
|
raw::TraitObject>(self).data)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn downcast_unchecked<T: 'static>(self: Box<NetworkStream>) -> Box<T> {
|
unsafe fn downcast_unchecked<T: 'static>(self: Box<NetworkStream + Send>) -> Box<T> {
|
||||||
mem::transmute(mem::transmute::<Box<NetworkStream>,
|
mem::transmute(mem::transmute::<Box<NetworkStream + Send>,
|
||||||
raw::TraitObject>(self).data)
|
raw::TraitObject>(self).data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NetworkStream {
|
impl NetworkStream + Send {
|
||||||
/// Is the underlying type in this trait object a T?
|
/// Is the underlying type in this trait object a T?
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is<T: 'static>(&self) -> bool {
|
pub fn is<T: 'static>(&self) -> bool {
|
||||||
@@ -143,8 +143,8 @@ impl NetworkStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// If the underlying type is T, extract it.
|
/// If the underlying type is T, extract it.
|
||||||
pub fn downcast<T: 'static>(self: Box<NetworkStream>)
|
pub fn downcast<T: 'static>(self: Box<NetworkStream + Send>)
|
||||||
-> Result<Box<T>, Box<NetworkStream>> {
|
-> Result<Box<T>, Box<NetworkStream + Send>> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
Ok(unsafe { self.downcast_unchecked() })
|
Ok(unsafe { self.downcast_unchecked() })
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user