Skip to content

Commit

Permalink
Add error explanations for E0053, E0251, E0252, E0255, E0256, E0368.
Browse files Browse the repository at this point in the history
  • Loading branch information
Nick Hamann committed May 14, 2015
1 parent a4444aa commit 06aef33
Show file tree
Hide file tree
Showing 2 changed files with 164 additions and 8 deletions.
90 changes: 84 additions & 6 deletions src/librustc_resolve/diagnostics.rs
Expand Up @@ -49,6 +49,88 @@ about what constitutes an Item declaration and what does not:
http://doc.rust-lang.org/reference.html#statements
"##,

E0251: r##"
Two items of the same name cannot be imported without rebinding one of the
items under a new local name.
An example of this error:
```
use foo::baz;
use bar::*; // error, do `use foo::baz as quux` instead on the previous line
fn main() {}
mod foo {
pub struct baz;
}
mod bar {
pub mod baz {}
}
```
"##,

E0252: r##"
Two items of the same name cannot be imported without rebinding one of the
items under a new local name.
An example of this error:
```
use foo::baz;
use bar::baz; // error, do `use bar::baz as quux` instead
fn main() {}
mod foo {
pub struct baz;
}
mod bar {
pub mod baz {}
}
```
"##,

E0255: r##"
You can't import a value whose name is the same as another value defined in the
module.
An example of this error:
```
use foo::FOO; // error, do `use foo::FOO as BAR` instead
fn FOO() {}
mod foo {
pub const FOO: bool = true;
}
fn main() {}
```
"##,

E0256: r##"
You can't import a type or module when the name of the item being imported is
the same as another type or submodule defined in the module.
An example of this error:
```
use foo::Bar; // error
struct Bar;
mod foo {
pub mod Bar { }
}
fn main() {}
```
"##,

E0259: r##"
The name chosen for an external crate conflicts with another external crate that
has been imported into the current module.
Expand Down Expand Up @@ -122,14 +204,10 @@ http://doc.rust-lang.org/reference.html#types
register_diagnostics! {
E0157,
E0153,
E0251, // a named type or value has already been imported in this module
E0252, // a named type or value has already been imported in this module
E0253, // not directly importable
E0254, // import conflicts with imported crate in this module
E0255, // import conflicts with value in this module
E0256, // import conflicts with type in this module
E0257, // inherent implementations are only allowed on types defined in the current module
E0258, // import conflicts with existing submodule
E0257,
E0258,
E0364, // item is private
E0365 // item is private
}
82 changes: 80 additions & 2 deletions src/librustc_typeck/diagnostics.rs
Expand Up @@ -64,6 +64,44 @@ impl Foo for Bar {
```
"##,

E0053: r##"
In a trait method implementation, the function signature must match exactly.
This error indicates a mutability mismatch between a trait method signature
and the signature of the implementation.
Here's an example where the mutability of the `self` parameter is wrong:
```
trait Foo { fn foo(&self); }
struct Bar;
impl Foo for Bar {
// error, the signature should be `fn foo(&self)` instead
fn foo(&mut self) { }
}
fn main() {}
```
Here's another example, this time for a non-`self` parameter:
```
trait Foo { fn foo(x: &mut bool) -> bool; }
struct Bar;
impl Foo for Bar {
// error, the type of `x` should be `&mut bool` instead
fn foo(x: &bool) -> bool { *x }
}
fn main() {}
```
"##,

E0054: r##"
It is not allowed to cast to a bool. If you are trying to cast a numeric type
to a bool, you can compare it with zero instead:
Expand Down Expand Up @@ -483,6 +521,48 @@ The `Sized` trait is a special trait built-in to the compiler for types with a
constant size known at compile-time. This trait is automatically implemented
for types as needed by the compiler, and it is currently disallowed to
explicitly implement it for a type.
"##,

E0368: r##"
This error indicates that a binary assignment operator like `+=` or `^=` was
applied to the wrong types.
A couple examples of this are as follows:
```
let mut x: u16 = 5;
x ^= true; // error, `^=` cannot be applied to types `u16` and `bool`
x += (); // error, `+=` cannot be applied to types `u16` and `()`
```
Another problem you might be facing is this: suppose you've overloaded the `+`
operator for some type `Foo` by implementing the `std::ops::Add` trait for
`Foo`, but you find that using `+=` does not work, as in this example:
```
use std::ops::Add;
struct Foo(u32);
impl Add for Foo {
type Output = Foo;
fn add(self, rhs: Foo) -> Foo {
Foo(self.0 + rhs.0)
}
}
fn main() {
let mut x: Foo = Foo(5);
x += Foo(7); // error, `+= cannot be applied to types `Foo` and `Foo`
}
```
This is because the binary assignment operators currently do not work off of
traits, so it is not possible to overload them. See [RFC 953] for a proposal
to change this.
[RFC 953]: https://github.com/rust-lang/rfcs/pull/953
"##

}
Expand All @@ -503,7 +583,6 @@ register_diagnostics! {
E0040, // explicit use of destructor method
E0044, // foreign items may not have type parameters
E0045, // variadic function must have C calling convention
E0053,
E0055, // method has an incompatible type for trait
E0057, // method has an incompatible type for trait
E0059,
Expand Down Expand Up @@ -629,7 +708,6 @@ register_diagnostics! {
E0328, // cannot implement Unsize explicitly
E0366, // dropck forbid specialization to concrete type or region
E0367, // dropck forbid specialization to predicate not in struct/enum
E0368, // binary operation `<op>=` cannot be applied to types
E0369, // binary operation `<op>` cannot be applied to types
E0371, // impl Trait for Trait is illegal
E0372, // impl Trait for Trait where Trait is not object safe
Expand Down

0 comments on commit 06aef33

Please sign in to comment.