diff --git a/src/rust-2021/warnings-promoted-to-error.md b/src/rust-2021/warnings-promoted-to-error.md index 117b0d59..f17e2b2b 100644 --- a/src/rust-2021/warnings-promoted-to-error.md +++ b/src/rust-2021/warnings-promoted-to-error.md @@ -2,18 +2,48 @@ ## Summary -- `bare-trait-objects` and `ellipsis-inclusive-range-patters` are now hard errors. +- Code that triggered the `bare_trait_objects` and `ellipsis_inclusive_range_patterns` lints will error in Rust 2021. ## Details -Two existing lints are becoming hard errors in Rust 2021. -These lints will remain warnings in older editions. +Two existing lints are becoming hard errors in Rust 2021, but these lints will remain warnings in older editions. -* `bare-trait-objects`: - The use of the `dyn` keyword to identify [trait objects](https://doc.rust-lang.org/book/ch17-02-trait-objects.html) - will be mandatory in Rust 2021. +### `bare_trait_objects`: -* `ellipsis-inclusive-range-patterns`: - The [deprecated `...` syntax](https://doc.rust-lang.org/stable/reference/patterns.html#range-patterns) - for inclusive range patterns is no longer accepted in Rust 2021. - It has been superseded by `..=`, which is consistent with expressions. +The use of the `dyn` keyword to identify [trait objects](https://doc.rust-lang.org/book/ch17-02-trait-objects.html) +will be mandatory in Rust 2021. + +For example, the following code which does not include the `dyn` keyword in `&MyTrait` +will produce an error instead of just a lint in Rust 2021: + +```rust +pub trait MyTrait {} + +pub fn my_function(_trait_object: &MyTrait) { // should be `&dyn MyTrait` + unimplemented!() +} +``` + +### `ellipsis_inclusive_range_patterns`: + +The [deprecated `...` syntax](https://doc.rust-lang.org/stable/reference/patterns.html#range-patterns) +for inclusive range patterns (i.e., ranges where the end value is *included* in the range) is no longer +accepted in Rust 2021. It has been superseded by `..=`, which is consistent with expressions. + +For example, the following code which uses `...` in a pattern will produce an error instead of +just a lint in Rust 2021: + +```rust +pub fn less_or_eq_to_100(n: u8) -> bool { + matches!(n, 0...100) // should be `0..=100` +} +``` + +## Migrations + +If your Rust 2015 or 2018 code does not produce any warnings for `bare_trait_objects` +or `ellipsis_inclusive_range_patterns` and you've not allowed these lints through the +use of `#![allow()]` or some other mechanism, then there's no need to migrate. + +To automatically migrate any crate that uses `...` in patterns or does not use `dyn` with +trait objects, you can run `cargo fix --edition`. \ No newline at end of file