summaryrefslogtreecommitdiffstats
path: root/tests/ui/rust-2021/future-prelude-collision.fixed
blob: 43b0ec1c3e6a709fab2eefc5670e7c80854b67a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// 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
}