mod mul1 { pub trait Mul {} } mod mul2 { pub trait Mul {} } mod mul3 { enum Mul { Yes, No } } mod mul4 { type Mul = String; } mod mul5 { struct Mul{ left_term: u32, right_term: u32 } } #[derive(Debug)] struct Foo; // When we comment the next line: //use mul1::Mul; // BEFORE, we got the following error for the `impl` below: // error: use of undeclared trait name `Mul` [E0405] // AFTER, we get this message: // error: trait `Mul` is not in scope. // help: ... // help: you can import several candidates into scope (`use ...;`): // help: `mul1::Mul` // help: `mul2::Mul` // help: `std::ops::Mul` impl Mul for Foo { //~^ ERROR cannot find trait `Mul` } // BEFORE, we got: // error: use of undeclared type name `Mul` [E0412] // AFTER, we get: // error: type name `Mul` is not in scope. Maybe you meant: // help: ... // help: you can import several candidates into scope (`use ...;`): // help: `mul1::Mul` // help: `mul2::Mul` // help: `mul3::Mul` // help: `mul4::Mul` // help: and 2 other candidates fn getMul() -> Mul { //~^ ERROR cannot find type `Mul` } // Let's also test what happens if the trait doesn't exist: impl ThisTraitReallyDoesntExistInAnyModuleReally for Foo { //~^ ERROR cannot find trait `ThisTraitReallyDoesntExistInAnyModuleReally` } // Let's also test what happens if there's just one alternative: impl Div for Foo { //~^ ERROR cannot find trait `Div` } fn main() { let foo = Foo(); println!("Hello, {:?}!", foo); }