99 lines
3.0 KiB
Rust
99 lines
3.0 KiB
Rust
//@ run-rustfix
|
|
//@ edition:2018
|
|
//@ check-pass
|
|
#![warn(rust_2021_prelude_collisions)]
|
|
|
|
trait TryIntoU32 {
|
|
fn try_into(self) -> Result<u32, ()>;
|
|
}
|
|
|
|
impl TryIntoU32 for u8 {
|
|
fn try_into(self) -> Result<u32, ()> {
|
|
Ok(self as u32)
|
|
}
|
|
}
|
|
|
|
// needed for autoref test
|
|
impl TryIntoU32 for &f32 {
|
|
fn try_into(self) -> Result<u32, ()> {
|
|
Ok(*self as u32)
|
|
}
|
|
}
|
|
|
|
trait TryFromU8: Sized {
|
|
fn try_from(x: u8) -> Result<Self, ()>;
|
|
}
|
|
|
|
impl TryFromU8 for u32 {
|
|
fn try_from(x: u8) -> Result<Self, ()> {
|
|
Ok(x as u32)
|
|
}
|
|
}
|
|
|
|
impl TryIntoU32 for *const u16 {
|
|
fn try_into(self) -> Result<u32, ()> {
|
|
Ok(unsafe { *self } as u32)
|
|
}
|
|
}
|
|
|
|
trait FromByteIterator {
|
|
fn from_iter<T>(iter: T) -> Self
|
|
where
|
|
T: Iterator<Item = u8>;
|
|
}
|
|
|
|
impl FromByteIterator for Vec<u8> {
|
|
fn from_iter<T>(iter: T) -> Self
|
|
where
|
|
T: Iterator<Item = u8>,
|
|
{
|
|
iter.collect()
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
// test dot-call that will break in 2021 edition
|
|
let _: u32 = TryIntoU32::try_into(3u8).unwrap();
|
|
//~^ WARNING trait method `try_into` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
// test associated function call that will break in 2021 edition
|
|
let _ = <u32 as TryFromU8>::try_from(3u8).unwrap();
|
|
//~^ WARNING trait-associated function `try_from` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
// test reverse turbofish too
|
|
let _ = <Vec<u8> as FromByteIterator>::from_iter(vec![1u8, 2, 3, 4, 5, 6].into_iter());
|
|
//~^ WARNING trait-associated function `from_iter` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
// negative testing lint (this line should *not* emit a warning)
|
|
let _: u32 = TryFromU8::try_from(3u8).unwrap();
|
|
|
|
// test type omission
|
|
let _: u32 = <_ as TryFromU8>::try_from(3u8).unwrap();
|
|
//~^ WARNING trait-associated function `try_from` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
// test autoderef
|
|
let _: u32 = TryIntoU32::try_into(*(&3u8)).unwrap();
|
|
//~^ WARNING trait method `try_into` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
// test autoref
|
|
let _: u32 = TryIntoU32::try_into(&3.0).unwrap();
|
|
//~^ WARNING trait method `try_into` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
let mut data = 3u16;
|
|
let mut_ptr = std::ptr::addr_of_mut!(data);
|
|
let _: u32 = TryIntoU32::try_into(mut_ptr as *const _).unwrap();
|
|
//~^ WARNING trait method `try_into` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
|
|
type U32Alias = u32;
|
|
let _ = <U32Alias as TryFromU8>::try_from(3u8).unwrap();
|
|
//~^ WARNING trait-associated function `try_from` will become ambiguous in Rust 2021
|
|
//~^^ WARNING this is accepted in the current edition
|
|
}
|