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