Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port erased cleanup #66443

Merged
merged 12 commits into from
Nov 15, 2019
5 changes: 5 additions & 0 deletions src/librustc_error_codes/error_codes.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
// Error messages for EXXXX errors. Each message should start and end with a
// new line, and be wrapped to 80 characters. In vim you can `:set tw=80` and
// use `gq` to wrap paragraphs. Use `:set tw=0` to disable.
//
// /!\ IMPORTANT /!\
//
// Error messages' format must follow the RFC 1567 available here:
// https://github.com/rust-lang/rfcs/pull/1567

crate::register_diagnostics! {

Expand Down
9 changes: 6 additions & 3 deletions src/librustc_error_codes/error_codes/E0023.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
A pattern used to match against an enum variant must provide a sub-pattern for
each field of the enum variant. This error indicates that a pattern attempted to
extract an incorrect number of fields from a variant.
A pattern attempted to extract an incorrect number of fields from a variant.

Erroneous code example:

```
enum Fruit {
Expand All @@ -9,6 +9,9 @@ enum Fruit {
}
```

A pattern used to match against an enum variant must provide a sub-pattern for
each field of the enum variant.

Here the `Apple` variant has two fields, and should be matched against like so:

```
Expand Down
5 changes: 3 additions & 2 deletions src/librustc_error_codes/error_codes/E0025.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
Each field of a struct can only be bound once in a pattern. Erroneous code
example:
Each field of a struct can only be bound once in a pattern.

Erroneous code example:

```compile_fail,E0025
struct Foo {
Expand Down
37 changes: 10 additions & 27 deletions src/librustc_error_codes/error_codes/E0026.md
Original file line number Diff line number Diff line change
@@ -1,51 +1,34 @@
This error indicates that a struct pattern attempted to extract a non-existent
field from a struct. Struct fields are identified by the name used before the
colon `:` so struct patterns should resemble the declaration of the struct type
being matched.
A struct pattern attempted to extract a non-existent field from a struct.

```
// Correct matching.
struct Thing {
x: u32,
y: u32
}

let thing = Thing { x: 1, y: 2 };

match thing {
Thing { x: xfield, y: yfield } => {}
}
```

If you are using shorthand field patterns but want to refer to the struct field
by a different name, you should rename it explicitly.

Change this:
Erroneous code example:

```compile_fail,E0026
struct Thing {
x: u32,
y: u32
y: u32,
}

let thing = Thing { x: 0, y: 0 };

match thing {
Thing { x, z } => {}
Thing { x, z } => {} // error: `Thing::z` field doesn't exist
}
```

To this:
If you are using shorthand field patterns but want to refer to the struct field
by a different name, you should rename it explicitly. Struct fields are
identified by the name used before the colon `:` so struct patterns should
resemble the declaration of the struct type being matched.

```
struct Thing {
x: u32,
y: u32
y: u32,
}

let thing = Thing { x: 0, y: 0 };

match thing {
Thing { x, y: z } => {}
Thing { x, y: z } => {} // we renamed `y` to `z`
}
```
10 changes: 5 additions & 5 deletions src/librustc_error_codes/error_codes/E0027.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
This error indicates that a pattern for a struct fails to specify a sub-pattern
for every one of the struct's fields. Ensure that each field from the struct's
definition is mentioned in the pattern, or use `..` to ignore unwanted fields.
A pattern for a struct fails to specify a sub-pattern for every one of the
struct's fields.

For example:
Erroneous code example:

```compile_fail,E0027
struct Dog {
Expand All @@ -18,7 +17,8 @@ match d {
}
```

This is correct (explicit):
To fix this error, ensure that each field from the struct's definition is
mentioned in the pattern, or use `..` to ignore unwanted fields. Example:

```
struct Dog {
Expand Down
14 changes: 9 additions & 5 deletions src/librustc_error_codes/error_codes/E0029.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
In a match expression, only numbers and characters can be matched against a
range. This is because the compiler checks that the range is non-empty at
compile-time, and is unable to evaluate arbitrary comparison functions. If you
want to capture values of an orderable type between two end-points, you can use
a guard.
Something other than numbers and characters has been used for a range.

Erroneous code example:

```compile_fail,E0029
let string = "salutations !";
Expand All @@ -20,3 +18,9 @@ match string {
_ => {}
}
```

In a match expression, only numbers and characters can be matched against a
range. This is because the compiler checks that the range is non-empty at
compile-time, and is unable to evaluate arbitrary comparison functions. If you
want to capture values of an orderable type between two end-points, you can use
a guard.
16 changes: 10 additions & 6 deletions src/librustc_error_codes/error_codes/E0033.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
This error indicates that a pointer to a trait type cannot be implicitly
dereferenced by a pattern. Every trait defines a type, but because the
size of trait implementers isn't fixed, this type has no compile-time size.
Therefore, all accesses to trait types must be through pointers. If you
encounter this error you should try to avoid dereferencing the pointer.
A trait type has been dereferenced.

Erroneous code example:

```compile_fail,E0033
# trait SomeTrait { fn method_one(&self){} fn method_two(&self){} }
Expand All @@ -17,7 +15,13 @@ trait_obj.method_one();
trait_obj.method_two();
```

A pointer to a trait type cannot be implicitly dereferenced by a pattern. Every
trait defines a type, but because the size of trait implementers isn't fixed,
this type has no compile-time size. Therefore, all accesses to trait types must
be through pointers. If you encounter this error you should try to avoid
dereferencing the pointer.

You can read more about trait objects in the [Trait Objects] section of the
Reference.

[Trait Objects]: https://doc.rust-lang.org/reference/types.html#trait-objects
[Trait Objects]: https://doc.rust-lang.org/reference/types.html#trait-objects
4 changes: 3 additions & 1 deletion src/librustc_error_codes/error_codes/E0034.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
The compiler doesn't know what method to call because more than one method
has the same prototype. Erroneous code example:
has the same prototype.

Erroneous code example:

```compile_fail,E0034
struct Test;
Expand Down
25 changes: 21 additions & 4 deletions src/librustc_error_codes/error_codes/E0040.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
It is not allowed to manually call destructors in Rust. It is also not
necessary to do this since `drop` is called automatically whenever a value goes
out of scope.
It is not allowed to manually call destructors in Rust.

Here's an example of this error:
Erroneous code example:

```compile_fail,E0040
struct Foo {
Expand All @@ -20,3 +18,22 @@ fn main() {
x.drop(); // error: explicit use of destructor method
}
```

It is unnecessary to do this since `drop` is called automatically whenever a
value goes out of scope. However, if you really need to drop a value by hand,
you can use the `std::mem::drop` function:

```
struct Foo {
x: i32,
}
impl Drop for Foo {
fn drop(&mut self) {
println!("kaboom");
}
}
fn main() {
let mut x = Foo { x: -7 };
drop(x); // ok!
}
```
1 change: 1 addition & 0 deletions src/librustc_error_codes/error_codes/E0044.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
You cannot use type or const parameters on foreign items.

Example of erroneous code:

```compile_fail,E0044
Expand Down
20 changes: 10 additions & 10 deletions src/librustc_error_codes/error_codes/E0045.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
Rust only supports variadic parameters for interoperability with C code in its
FFI. As such, variadic parameters can only be used with functions which are
using the C ABI. Examples of erroneous code:

```compile_fail
#![feature(unboxed_closures)]
Variadic parameters have been used on a non-C ABI function.

extern "rust-call" { fn foo(x: u8, ...); }
Erroneous code example:

// or
```compile_fail,E0045
#![feature(unboxed_closures)]

fn foo(x: u8, ...) {}
extern "rust-call" {
fn foo(x: u8, ...); // error!
}
```

To fix such code, put them in an extern "C" block:
Rust only supports variadic parameters for interoperability with C code in its
FFI. As such, variadic parameters can only be used with functions which are
using the C ABI. To fix such code, put them in an extern "C" block:

```
extern "C" {
Expand Down
4 changes: 3 additions & 1 deletion src/librustc_error_codes/error_codes/E0046.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
Items are missing in a trait implementation. Erroneous code example:
Items are missing in a trait implementation.

Erroneous code example:

```compile_fail,E0046
trait Foo {
Expand Down
25 changes: 21 additions & 4 deletions src/librustc_error_codes/error_codes/E0049.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
This error indicates that an attempted implementation of a trait method
has the wrong number of type or const parameters.
An attempted implementation of a trait method has the wrong number of type or
const parameters.

For example, the trait below has a method `foo` with a type parameter `T`,
but the implementation of `foo` for the type `Bar` is missing this parameter:
Erroneous code example:

```compile_fail,E0049
trait Foo {
Expand All @@ -17,3 +16,21 @@ impl Foo for Bar {
fn foo(x: bool) -> Self { Bar }
}
```

For example, the `Foo` trait has a method `foo` with a type parameter `T`,
but the implementation of `foo` for the type `Bar` is missing this parameter.
To fix this error, they must have the same type parameters:

```
trait Foo {
fn foo<T: Default>(x: T) -> Self;
}

struct Bar;

impl Foo for Bar {
fn foo<T: Default>(x: T) -> Self { // ok!
Bar
}
}
```
26 changes: 21 additions & 5 deletions src/librustc_error_codes/error_codes/E0050.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
This error indicates that an attempted implementation of a trait method
has the wrong number of function parameters.
An attempted implementation of a trait method has the wrong number of function
parameters.

For example, the trait below has a method `foo` with two function parameters
(`&self` and `u8`), but the implementation of `foo` for the type `Bar` omits
the `u8` parameter:
Erroneous code example:

```compile_fail,E0050
trait Foo {
Expand All @@ -18,3 +16,21 @@ impl Foo for Bar {
fn foo(&self) -> bool { true }
}
```

For example, the `Foo` trait has a method `foo` with two function parameters
(`&self` and `u8`), but the implementation of `foo` for the type `Bar` omits
the `u8` parameter. To fix this error, they must have the same parameters:

```
trait Foo {
fn foo(&self, x: u8) -> bool;
}

struct Bar;

impl Foo for Bar {
fn foo(&self, x: u8) -> bool { // ok!
true
}
}
```
2 changes: 1 addition & 1 deletion src/librustc_error_codes/error_codes/E0053.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
The parameters of any trait method must match between a trait implementation
and the trait definition.

Here are a couple examples of this error:
Erroneous code example:

```compile_fail,E0053
trait Foo {
Expand Down
8 changes: 6 additions & 2 deletions src/librustc_error_codes/error_codes/E0054.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
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:
It is not allowed to cast to a bool.

Erroneous code example:

```compile_fail,E0054
let x = 5;
Expand All @@ -8,6 +9,9 @@ let x = 5;
let x_is_nonzero = x as bool;
```

If you are trying to cast a numeric type to a bool, you can compare it with
zero instead:

```
let x = 5;

Expand Down