// run-rustfix

#![allow(warnings)]

// Test that suggestion to add `*` characters applies to implementations of `Deref` as well as
// references.

struct Foo(i32);

struct Bar(String);

impl std::ops::Deref for Foo {
    type Target = i32;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl std::ops::Deref for Bar {
    type Target = String;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let x = Foo(42);
    let y: i32 = *x; //~ ERROR mismatched types
    let a = &42;
    let b: i32 = *a; //~ ERROR mismatched types

    // Do not make a suggestion when adding a `*` wouldn't actually fix the issue:
    let f = Bar("bar".to_string());
    let g: String = f.to_string(); //~ ERROR mismatched types
}
