Skip to content

cargo fix --broken-code does not generate stubs for trait impls despite the error message containing the appropriate stubs #100284

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

Closed
SoniEx2 opened this issue Aug 8, 2022 · 6 comments
Labels
C-bug Category: This is a bug.

Comments

@SoniEx2
Copy link
Contributor

SoniEx2 commented Aug 8, 2022

$ cargo fix --broken-code --allow-dirty
    Checking datafu v0.1.0 (/home/soniex2/git/selfhosted/rust.datafu)
warning: failed to automatically apply fixes suggested by rustc to crate `datafu`

after fixes were automatically applied the compiler reported errors within these files:

  * /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/core/src/macros/mod.rs
  * src/vm/de.rs

This likely indicates a bug in either rustc or cargo itself,
and we would appreciate a bug report! You're likely to see 
a number of compiler warnings after this message which cargo
attempted to fix but failed. If you could open an issue at
https://github.com/rust-lang/rust/issues
quoting the full output of this command we'd be very appreciative!
Note that you may be able to make some more progress in the near-term
fixing code with the `--broken-code` flag

The following errors were reported:
error[E0046]: not all trait items implemented, missing: `deserialize_any`, `deserialize_bool`, `deserialize_i8`, `deserialize_i16`, `deserialize_i32`, `deserialize_i64`, `deserialize_u8`, `deserialize_u16`, `deserialize_u32`, `deserialize_u64`, `deserialize_f32`, `deserialize_f64`, `deserialize_char`, `deserialize_str`, `deserialize_string`, `deserialize_bytes`, `deserialize_byte_buf`, `deserialize_option`, `deserialize_unit`, `deserialize_unit_struct`, `deserialize_newtype_struct`, `deserialize_seq`, `deserialize_tuple`, `deserialize_tuple_struct`, `deserialize_map`, `deserialize_struct`, `deserialize_enum`, `deserialize_identifier`, `deserialize_ignored_any`
  --> src/vm/de.rs:18:1
   |
18 | / impl<'de, Der> serde::Deserializer<'de> for Deserializer<Der>
19 | | where
20 | |     Der: serde::Deserializer<'de>
21 | | {
22 | |     type Error = Der::Error;
23 | | }
   | |_^ missing `deserialize_any`, `deserialize_bool`, `deserialize_i8`, `deserialize_i16`, `deserialize_i32`, `deserialize_i64`, `deserialize_u8`, `deserialize_u16`, `deserialize_u32`, `deserialize_u64`, `deserialize_f32`, `deserialize_f64`, `deserialize_char`, `deserialize_str`, `deserialize_string`, `deserialize_bytes`, `deserialize_byte_buf`, `deserialize_option`, `deserialize_unit`, `deserialize_unit_struct`, `deserialize_newtype_struct`, `deserialize_seq`, `deserialize_tuple`, `deserialize_tuple_struct`, `deserialize_map`, `deserialize_struct`, `deserialize_enum`, `deserialize_identifier`, `deserialize_ignored_any` in implementation
   |
   = help: implement the missing item: `fn deserialize_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_bool<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i8<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i16<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u8<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u16<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_f32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_f64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_char<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_str<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_string<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_bytes<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_byte_buf<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_option<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_unit<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_unit_struct<V>(self, _: &'static str, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_newtype_struct<V>(self, _: &'static str, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_seq<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_tuple<V>(self, _: usize, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_tuple_struct<V>(self, _: &'static str, _: usize, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_map<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_struct<V>(self, _: &'static str, _: &'static [&'static str], _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_enum<V>(self, _: &'static str, _: &'static [&'static str], _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_identifier<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_ignored_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`

warning: unreachable expression
  --> src/vm/de.rs:12:9
   |
12 | /         Self {
13 | |             _der: todo!()
   | |                   ------- any code following this expression is unreachable
14 | |         }
   | |_________^ unreachable expression
   |
   = note: `#[warn(unreachable_code)]` on by default

error: aborting due to previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0046`.
Original diagnostics will follow.

error[E0046]: not all trait items implemented, missing: `deserialize_any`, `deserialize_bool`, `deserialize_i8`, `deserialize_i16`, `deserialize_i32`, `deserialize_i64`, `deserialize_u8`, `deserialize_u16`, `deserialize_u32`, `deserialize_u64`, `deserialize_f32`, `deserialize_f64`, `deserialize_char`, `deserialize_str`, `deserialize_string`, `deserialize_bytes`, `deserialize_byte_buf`, `deserialize_option`, `deserialize_unit`, `deserialize_unit_struct`, `deserialize_newtype_struct`, `deserialize_seq`, `deserialize_tuple`, `deserialize_tuple_struct`, `deserialize_map`, `deserialize_struct`, `deserialize_enum`, `deserialize_identifier`, `deserialize_ignored_any`
  --> src/vm/de.rs:18:1
   |
18 | / impl<'de, Der> serde::Deserializer<'de> for Deserializer<Der>
19 | | where
20 | |     Der: serde::Deserializer<'de>
21 | | {
22 | |     type Error = Der::Error;
23 | | }
   | |_^ missing `deserialize_any`, `deserialize_bool`, `deserialize_i8`, `deserialize_i16`, `deserialize_i32`, `deserialize_i64`, `deserialize_u8`, `deserialize_u16`, `deserialize_u32`, `deserialize_u64`, `deserialize_f32`, `deserialize_f64`, `deserialize_char`, `deserialize_str`, `deserialize_string`, `deserialize_bytes`, `deserialize_byte_buf`, `deserialize_option`, `deserialize_unit`, `deserialize_unit_struct`, `deserialize_newtype_struct`, `deserialize_seq`, `deserialize_tuple`, `deserialize_tuple_struct`, `deserialize_map`, `deserialize_struct`, `deserialize_enum`, `deserialize_identifier`, `deserialize_ignored_any` in implementation
   |
   = help: implement the missing item: `fn deserialize_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_bool<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i8<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i16<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u8<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u16<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_f32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_f64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_char<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_str<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_string<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_bytes<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_byte_buf<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_option<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_unit<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_unit_struct<V>(self, _: &'static str, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_newtype_struct<V>(self, _: &'static str, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_seq<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_tuple<V>(self, _: usize, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_tuple_struct<V>(self, _: &'static str, _: usize, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_map<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_struct<V>(self, _: &'static str, _: &'static [&'static str], _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_enum<V>(self, _: &'static str, _: &'static [&'static str], _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_identifier<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_ignored_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`

warning: unreachable expression
  --> src/vm/de.rs:12:9
   |
12 | /         Self {
13 | |             _der: todo!()
   | |                   ------- any code following this expression is unreachable
14 | |         }
   | |_________^ unreachable expression
   |
   = note: `#[warn(unreachable_code)]` on by default

For more information about this error, try `rustc --explain E0046`.
warning: `datafu` (lib) generated 1 warning (1 duplicate)
error: could not compile `datafu` due to previous error; 1 warning emitted
warning: build failed, waiting for other jobs to finish...
warning: `datafu` (lib test) generated 1 warning
error: build failed

Meta

rustc --version --verbose:

$ rustc --version --verbose
rustc 1.60.0 (7737e0b5c 2022-04-04)
binary: rustc
commit-hash: 7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c
commit-date: 2022-04-04
host: x86_64-unknown-linux-gnu
release: 1.60.0
LLVM version: 14.0.0

(this also applies to 1.62.1 but it doesn't suggest making a bug report for it)

Backtrace

<backtrace>

@SoniEx2 SoniEx2 added the C-bug Category: This is a bug. label Aug 8, 2022
@ehuss
Copy link
Contributor

ehuss commented Aug 9, 2022

Thanks for the report! Can you possibly share the code or put together some kind of reproduction? I'm curious if the impl serde::Deserializer was added by rustc or was it already there? I'm a bit confused since I can't think of a way for fix to get as far as it did if an empty impl already existed.

@SoniEx2
Copy link
Contributor Author

SoniEx2 commented Aug 9, 2022

This:

pub struct RootDeserializer<Der> {
    _der: std::marker::PhantomData<Der>,
}

impl<'de, Der: serde::Deserializer<'de>> RootDeserializer<Der> {
    pub fn new(der: Der, max_calls: usize) -> Self {
        Self {
            _der: todo!()
        }
    }
}

impl<'de, Der> serde::Deserializer<'de> for RootDeserializer<Der>
where
    Der: serde::Deserializer<'de>
{
    type Error = Der::Error;
}

produces this error:

error[E0046]: not all trait items implemented, missing: `deserialize_any`, `deserialize_bool`, `deserialize_i8`, `deserialize_i16`, `deserialize_i32`, `deserialize_i64`, `deserialize_u8`, `deserialize_u16`, `deserialize_u32`, `deserialize_u64`, `deserialize_f32`, `deserialize_f64`, `deserialize_char`, `deserialize_str`, `deserialize_string`, `deserialize_bytes`, `deserialize_byte_buf`, `deserialize_option`, `deserialize_unit`, `deserialize_unit_struct`, `deserialize_newtype_struct`, `deserialize_seq`, `deserialize_tuple`, `deserialize_tuple_struct`, `deserialize_map`, `deserialize_struct`, `deserialize_enum`, `deserialize_identifier`, `deserialize_ignored_any`
  --> src/vm/de.rs:16:1
   |
16 | / impl<'de, Der> serde::Deserializer<'de> for RootDeserializer<Der>
17 | | where
18 | |     Der: serde::Deserializer<'de>
19 | | {
20 | |     type Error = Der::Error;
21 | | }
   | |_^ missing `deserialize_any`, `deserialize_bool`, `deserialize_i8`, `deserialize_i16`, `deserialize_i32`, `deserialize_i64`, `deserialize_u8`, `deserialize_u16`, `deserialize_u32`, `deserialize_u64`, `deserialize_f32`, `deserialize_f64`, `deserialize_char`, `deserialize_str`, `deserialize_string`, `deserialize_bytes`, `deserialize_byte_buf`, `deserialize_option`, `deserialize_unit`, `deserialize_unit_struct`, `deserialize_newtype_struct`, `deserialize_seq`, `deserialize_tuple`, `deserialize_tuple_struct`, `deserialize_map`, `deserialize_struct`, `deserialize_enum`, `deserialize_identifier`, `deserialize_ignored_any` in implementation
   |
   = help: implement the missing item: `fn deserialize_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_bool<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i8<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i16<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_i64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u8<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u16<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_u64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_f32<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_f64<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_char<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_str<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_string<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_bytes<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_byte_buf<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_option<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_unit<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_unit_struct<V>(self, _: &'static str, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_newtype_struct<V>(self, _: &'static str, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_seq<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_tuple<V>(self, _: usize, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_tuple_struct<V>(self, _: &'static str, _: usize, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_map<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_struct<V>(self, _: &'static str, _: &'static [&'static str], _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_enum<V>(self, _: &'static str, _: &'static [&'static str], _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_identifier<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`
   = help: implement the missing item: `fn deserialize_ignored_any<V>(self, _: V) -> Result<<V as Visitor<'de>>::Value, <Self as serde::Deserializer<'de>>::Error> where V: Visitor { todo!() }`

which we strongly believe cargo fix --broken-code should fix, by adding in the necessary stubs.

we know cargo fix --broken-code isn't an IDE but it'd be nice to be able to use it as such... then again copypasting the error into the impl also works. (tho the error assumes Visitor is in scope, which it isn't, but whatever.)

@ehuss
Copy link
Contributor

ehuss commented Aug 9, 2022

Yea, it's known that fix can't apply fixes to code that doesn't already compile (or for suggestions that are possibly incorrect like the ones shown here).

I'm more curious how it got to say warning: failed to automatically apply fixes, as that implies there was some already passing code, and somehow the suggestions applied switched it to be broken. Do you happen to recall if the fix was attempted before the empty impl was added? I'm wondering if it somehow added that empty impl automatically?

@SoniEx2
Copy link
Contributor Author

SoniEx2 commented Aug 9, 2022

isn't --broken-code literally supposed to apply fixes to broken code? .-.

and no, the impl was already there, we just wanted it to helpfully fill it in for us.

the only fix it did apply, was removing an unused use crate::vm; we had. (this appears to be what causes that message to be printed.) so, e.g.:

use crate::vm;

pub struct RootDeserializer<Der> {
    _der: std::marker::PhantomData<Der>,
}

impl<'de, Der: serde::Deserializer<'de>> RootDeserializer<Der> {
    pub fn new(der: Der, max_calls: usize) -> Self {
        Self {
            _der: todo!()
        }
    }
}

impl<'de, Der> serde::Deserializer<'de> for RootDeserializer<Der>
where
    Der: serde::Deserializer<'de>
{
    type Error = Der::Error;
}

@ehuss
Copy link
Contributor

ehuss commented Aug 9, 2022

Ah, thanks for the clarification.

The issue is that suggestions fall into different classes. Some are marked as "machine applicable" where they can be automatically applied. Others can be "maybe incorrect" or otherwise require human intervention. cargo fix is not currently capable of applying the non-machine ones. rustc isn't designed for doing general code refactoring, so its suggestion capabilities are limited. In this case, the suggestion for filling out a trait's methods isn't machine-applicable, and provides code that won't successfully compile.

I'm going to close in favor of these other issues which are tracking what you are seeing here:

@ehuss ehuss closed this as not planned Won't fix, can't repro, duplicate, stale Aug 9, 2022
@SoniEx2
Copy link
Contributor Author

SoniEx2 commented Aug 9, 2022

The suggestions here do compile (mostly). They're valid code, tho they do need small adjustments to take imports (or lack thereof) into account. For all intents and purposes, these should be machine-applicable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug.
Projects
None yet
Development

No branches or pull requests

2 participants