File: inherent-dyn-collision.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (54 lines) | stat: -rw-r--r-- 1,500 bytes parent folder | download | duplicates (3)
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
// Test case where the method we want is an inherent method on a
// dyn Trait. In that case, the fix is to insert `*` on the receiver.
//
//@ check-pass
//@ run-rustfix
//@ edition:2018

#![warn(rust_2021_prelude_collisions)]

trait TryIntoU32 {
    fn try_into(&self) -> Result<u32, ()>;
}

impl TryIntoU32 for u8 {
    // note: &self
    fn try_into(&self) -> Result<u32, ()> {
        Ok(22)
    }
}

mod inner {
    use super::get_dyn_trait;

    // note: this does nothing, but is copying from ffishim's problem of
    // having a struct of the same name as the trait in-scope, while *also*
    // implementing the trait for that struct but **without** importing the
    // trait itself into scope
    #[allow(dead_code)]
    struct TryIntoU32;

    impl super::TryIntoU32 for TryIntoU32 {
        fn try_into(&self) -> Result<u32, ()> {
            Ok(0)
        }
    }

    // this is where the gross part happens. since `get_dyn_trait` returns
    // a Box<dyn Trait>, it can still call the method for `dyn Trait` without
    // `Trait` being in-scope. it might even be possible to make the trait itself
    // entirely unreference-able from the callsite?
    pub fn test() -> u32 {
        get_dyn_trait().try_into().unwrap()
        //~^ WARNING trait method `try_into` will become ambiguous
        //~| WARNING this is accepted in the current edition
    }
}

fn get_dyn_trait() -> Box<dyn TryIntoU32> {
    Box::new(3u8) as Box<dyn TryIntoU32>
}

fn main() {
    dbg!(inner::test());
}