Warnings promoted to errors - The Rust Edition Guide

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Warnings promoted to errors

## Summary

- 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, but these lints will remain warnings in older editions.

### `bare_trait_objects`:

The use of the `dyn` keyword to identify trait objects 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:

    #![allow(unused)]
    fn main() {
    pub trait MyTrait {}

    pub fn my_function(_trait_object: &MyTrait) { // should be `&dyn MyTrait`
      unimplemented!()
    }
    }

### `ellipsis_inclusive_range_patterns`:

The deprecated `...` syntax 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:

    #![allow(unused)]
    fn main() {
    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`.