Skip to content

Failure to update dyn usage in Rust 2018 to 2021 transition #86751

Description

@rylev

To reproduce:

  • Clone serde.
  • Run cargo +nightly fix --edition (this updates serde from Rust 2015 to Rust 2018).
  • Add the edition field to the Cargo.toml with "2018" and commit changes.
  • Run cargo +nightly fix --edition (this updates serde from Rust 2018 to Rust 2021).
  • Change the edition field to "2021" (ensure cargo-features = ["edition2021"] is present at the top of the Cargo.toml file)

This produces an error because some uses of bare trait objects were not updated:

error[E0782]: trait objects must include the `dyn` keyword
    --> serde/src/private/de.rs:1725:37
     |
1725 |         fn invalid_type(self, exp: &Expected) -> E {
     |                                     ^^^^^^^^
     |
help: add `dyn` keyword before this trait

Running cargo +nightly rustc -- -Zunstable-options --force-warns rust_2021_compatibility produces the proper warnings, but these are not picked up by cargo fix.

warning: trait objects without an explicit `dyn` are deprecated
    --> serde/src/private/de.rs:1725:37
     |
1725 |         fn invalid_type(self, exp: &Expected) -> E {
     |                                     ^^^^^^^^ help: use `dyn`: `dyn Expected`
     |
     = warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
     = note: for more information, see issue #80165 <https://github.com/rust-lang/rust/issues/80165>

I'm filing this in rust-lang/rust instead of in rust-lang/cargo, because I have a feeling this is a rustc issue.

Meta

rustc +nightly --version --verbose:

rustc 1.55.0-nightly (6d820866a 2021-06-29)
binary: rustc
commit-hash: 6d820866a27b1949e237be79b9c8c0145fe728b7
commit-date: 2021-06-29
host: x86_64-unknown-linux-gnu
release: 1.55.0-nightly
LLVM version: 12.0.1

Activity

  1. added
    A-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.
    C-bugCategory: This is a bug.
    on Jun 30, 2021
  2. ehuss commented on Jun 30, 2021

    @ehuss
    Contributor

    For reference, the cause is that cargo is using --force-warns=rust-2021-compatibility and --cap-lints=warn, and serde uses #![allow(bare_trait_objects)] and the interaction seems to be broken by #86009.

  3. self-assigned this
    on Jul 1, 2021
  4. added a commit that references this issue on Jul 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-edition-2021Area: The 2021 editionA-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.C-bugCategory: This is a bug.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions