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