// run-pass
// Check we do not select a private method or field when computing autoderefs

#![allow(unused)]

#[derive(Default)]
pub struct Bar2 { i: i32 }
#[derive(Default)]
pub struct Baz2(i32);

impl Bar2 {
    fn f(&self) -> bool { true }
}

mod foo {
    #[derive(Default)]
    pub struct Bar { i: ::Bar2 }
    #[derive(Default)]
    pub struct Baz(::Baz2);

    impl Bar {
        fn f(&self) -> bool { false }
    }

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

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

    pub fn f(bar: &Bar, baz: &Baz) {
        // Since the private fields and methods are visible here, there should be no autoderefs.
        let _: &::Bar2 = &bar.i;
        let _: &::Baz2 = &baz.0;
        assert!(!bar.f());
    }
}

fn main() {
    let bar = foo::Bar::default();
    let baz = foo::Baz::default();
    foo::f(&bar, &baz);

    let _: i32 = bar.i;
    let _: i32 = baz.0;
    assert!(bar.f());
}
