// Tests that methods that implement a trait cannot be invoked
// unless the trait is imported.

mod Lib {
    pub trait TheTrait {
        fn the_fn(&self);
    }

    pub struct TheStruct;

    impl TheTrait for TheStruct {
        fn the_fn(&self) {}
    }
}

mod Import {
    // Trait is in scope here:
    use Lib::TheStruct;
    use Lib::TheTrait;

    fn call_the_fn(s: &TheStruct) {
        s.the_fn();
    }
}

mod NoImport {
    // Trait is not in scope here:
    use Lib::TheStruct;

    fn call_the_fn(s: &TheStruct) {
        s.the_fn();
        //~^ ERROR E0599
    }
}

fn main() {}
