-
Notifications
You must be signed in to change notification settings - Fork 13.8k
compiler: Hint at multiple crate versions if trait impl is for wrong ADT #146874
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
Conversation
I haven't compared the two PRs but CC open PR #144674 which also touches this function. |
tests/run-make/crate-loading: Rename source files for clarity For rust-lang#146874 I originally tried to extend the existing test **tests/run-make/crate-loading**. That didn't work out since adding a re-export of the entire crate significantly changes the emitted error messsage. I did put some effort into making that test easier to understand however, by renaming its files. (Since I was confused myself at first.) Let's save some time for future devs by doing just the renames. Further cleanups are possible, but that will change the blessed output, so let's not do that right now. r? `@jieyouxu` since you have the context of rust-lang#146874
tests/run-make/crate-loading: Rename source files for clarity For rust-lang#146874 I originally tried to extend the existing test **tests/run-make/crate-loading**. That didn't work out since adding a re-export of the entire crate significantly changes the emitted error messsage. I did put some effort into making that test easier to understand however, by renaming its files. (Since I was confused myself at first.) Let's save some time for future devs by doing just the renames. Further cleanups are possible, but that will change the blessed output, so let's not do that right now. r? ``@jieyouxu`` since you have the context of rust-lang#146874
tests/run-make/crate-loading: Rename source files for clarity For rust-lang#146874 I originally tried to extend the existing test **tests/run-make/crate-loading**. That didn't work out since adding a re-export of the entire crate significantly changes the emitted error messsage. I did put some effort into making that test easier to understand however, by renaming its files. (Since I was confused myself at first.) Let's save some time for future devs by doing just the renames. Further cleanups are possible, but that will change the blessed output, so let's not do that right now. r? ```@jieyouxu``` since you have the context of rust-lang#146874
Rollup merge of #146875 - Enselic:better-file-names, r=jieyouxu tests/run-make/crate-loading: Rename source files for clarity For #146874 I originally tried to extend the existing test **tests/run-make/crate-loading**. That didn't work out since adding a re-export of the entire crate significantly changes the emitted error messsage. I did put some effort into making that test easier to understand however, by renaming its files. (Since I was confused myself at first.) Let's save some time for future devs by doing just the renames. Further cleanups are possible, but that will change the blessed output, so let's not do that right now. r? ```@jieyouxu``` since you have the context of #146874
tests/run-make/crate-loading: Rename source files for clarity For rust-lang#146874 I originally tried to extend the existing test **tests/run-make/crate-loading**. That didn't work out since adding a re-export of the entire crate significantly changes the emitted error messsage. I did put some effort into making that test easier to understand however, by renaming its files. (Since I was confused myself at first.) Let's save some time for future devs by doing just the renames. Further cleanups are possible, but that will change the blessed output, so let's not do that right now. r? ```@jieyouxu``` since you have the context of rust-lang#146874
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bors r+ |
…ieyouxu compiler: Hint at multiple crate versions if trait impl is for wrong ADT If a user does e.g. impl From<Bar> for foo::Foo and get a compilation error about that `From<Bar>` is not implemented for `Foo`, check if multiple versions of the crate with `Foo` is present in the dependency graph. If so, give a hint about it. Note that a test is added as a separate commit so it is easy to see what effect the fix has on the emitted error message. This can be seen as a continuation of rust-lang#124944. I think this closes RUST-71693 but I haven't checked since it lacks a minimal reproducer. If this gets merged I'll ask that reporter if this fix works for them. ## Real world example I encountered this case in the wild and didn't realize I had multiple versions of a crate in my dependency graph. So I was a bit confused at first. For reference, here is what that looked like. <details> <summary>Click to expand</summary> ### Before fix ``` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` ### After fix ``` Compiling auto-merge-dependabot-pull-requests-webhook v0.1.0 (/home/martin/src/auto-merge-dependabot-prs/rust-webhook) error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` </details>
Rollup of 14 pull requests Successful merges: - #142670 (Document fully-qualified syntax in `as`' keyword doc) - #145685 (add CloneFromCell and Cell::get_cloned) - #146330 (Bump unicode_data and printables to version 17.0.0) - #146451 (Fix atan2 inaccuracy in documentation) - #146479 (add mem::conjure_zst) - #146874 (compiler: Hint at multiple crate versions if trait impl is for wrong ADT ) - #147117 (interpret `#[used]` as `#[used(compiler)]` on illumos) - #147190 (std: `sys::net` cleanups) - #147251 (Do not assert that a change in global cache only happens when concurrent) - #147280 (Return to needs-llvm-components being info-only) - #147288 (compiletest: Make `DirectiveLine` responsible for name/value splitting) - #147309 (Add documentation about unwinding to wasm targets) - #147315 (bless autodiff batching test) - #147323 (Fix top level ui tests check in tidy) r? `@ghost` `@rustbot` modify labels: rollup
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
This comment was marked as off-topic.
@bors2 delegate=try |
✌️ @Enselic, you can now perform try builds on this pull request! You can now post |
@bors r+ |
…ieyouxu compiler: Hint at multiple crate versions if trait impl is for wrong ADT If a user does e.g. impl From<Bar> for foo::Foo and get a compilation error about that `From<Bar>` is not implemented for `Foo`, check if multiple versions of the crate with `Foo` is present in the dependency graph. If so, give a hint about it. Note that a test is added as a separate commit so it is easy to see what effect the fix has on the emitted error message. This can be seen as a continuation of rust-lang#124944. I think this closes RUST-71693 but I haven't checked since it lacks a minimal reproducer. If this gets merged I'll ask that reporter if this fix works for them. ## Real world example I encountered this case in the wild and didn't realize I had multiple versions of a crate in my dependency graph. So I was a bit confused at first. For reference, here is what that looked like. <details> <summary>Click to expand</summary> ### Before fix ``` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` ### After fix ``` Compiling auto-merge-dependabot-pull-requests-webhook v0.1.0 (/home/martin/src/auto-merge-dependabot-prs/rust-webhook) error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` </details> try-job: dist-various-1
compiler: Hint at multiple crate versions if trait impl is for wrong ADT If a user does e.g. impl From<Bar> for foo::Foo and get a compilation error about that `From<Bar>` is not implemented for `Foo`, check if multiple versions of the crate with `Foo` is present in the dependency graph. If so, give a hint about it. Note that a test is added as a separate commit so it is easy to see what effect the fix has on the emitted error message. This can be seen as a continuation of #124944. I think this closes RUST-71693 but I haven't checked since it lacks a minimal reproducer. If this gets merged I'll ask that reporter if this fix works for them. ## Real world example I encountered this case in the wild and didn't realize I had multiple versions of a crate in my dependency graph. So I was a bit confused at first. For reference, here is what that looked like. <details> <summary>Click to expand</summary> ### Before fix ``` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` ### After fix ``` Compiling auto-merge-dependabot-pull-requests-webhook v0.1.0 (/home/martin/src/auto-merge-dependabot-prs/rust-webhook) error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` </details> try-job: dist-various-1
This comment has been minimized.
This comment has been minimized.
💔 Test failed - checks-actions |
Oh... you may need to normalize path separators too... I've been meaning to pull out shared normalization logic into |
If a user does e.g. impl From<Bar> for foo::Foo and get a compilation error about that `From<Bar>` is not implemented for `Foo`, check if multiple versions of the crate with `Foo` is present in the dependency graph. If so, give a hint about it. I encountered this case in the wild and didn't realize I had multiple versions of a crate in my dependency graph. So I was a bit confused at first. This fix will make life easier for others.
f6d5d3e
to
eeb7cb1
Compare
@bors2 try |
compiler: Hint at multiple crate versions if trait impl is for wrong ADT try-job: dist-various-1 try-job: aarch64-msvc-1
This comment has been minimized.
This comment has been minimized.
@bors r+ rollup=iffy |
Rollup merge of #146874 - Enselic:multiple-adt-versions, r=jieyouxu compiler: Hint at multiple crate versions if trait impl is for wrong ADT If a user does e.g. impl From<Bar> for foo::Foo and get a compilation error about that `From<Bar>` is not implemented for `Foo`, check if multiple versions of the crate with `Foo` is present in the dependency graph. If so, give a hint about it. Note that a test is added as a separate commit so it is easy to see what effect the fix has on the emitted error message. This can be seen as a continuation of #124944. I think this closes RUST-71693 but I haven't checked since it lacks a minimal reproducer. If this gets merged I'll ask that reporter if this fix works for them. ## Real world example I encountered this case in the wild and didn't realize I had multiple versions of a crate in my dependency graph. So I was a bit confused at first. For reference, here is what that looked like. <details> <summary>Click to expand</summary> ### Before fix ``` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` ### After fix ``` Compiling auto-merge-dependabot-pull-requests-webhook v0.1.0 (/home/martin/src/auto-merge-dependabot-prs/rust-webhook) error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:5 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` error[E0277]: the trait bound `lambda_http::lambda_runtime::Diagnostic: From<Error>` is not satisfied --> src/main.rs:73:48 | 73 | lambda_http::run(service_fn(handle_event)).await | ^^^^^ the trait `From<Error>` is not implemented for `lambda_http::lambda_runtime::Diagnostic` | help: item with same name found --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_runtime-0.13.0/src/diagnostic.rs:43:1 | 43 | pub struct Diagnostic { | ^^^^^^^^^^^^^^^^^^^^^ = note: perhaps two different versions of crate `lambda_runtime` are being used? = help: the following other types implement trait `From<T>`: `lambda_http::lambda_runtime::Diagnostic` implements `From<&str>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError + Send + Sync>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Box<dyn StdError>>` `lambda_http::lambda_runtime::Diagnostic` implements `From<Infallible>` `lambda_http::lambda_runtime::Diagnostic` implements `From<lambda_runtime::deserializer::DeserializeError>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::io::Error>` `lambda_http::lambda_runtime::Diagnostic` implements `From<std::string::String>` = note: required for `Error` to implement `Into<lambda_http::lambda_runtime::Diagnostic>` note: required by a bound in `lambda_http::run` --> /home/martin/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lambda_http-0.17.0/src/lib.rs:199:26 | 194 | pub async fn run<'a, R, S, E>(handler: S) -> Result<(), Error> | --- required by a bound in this function ... 199 | E: std::fmt::Debug + Into<Diagnostic>, | ^^^^^^^^^^^^^^^^ required by this bound in `run` For more information about this error, try `rustc --explain E0277`. error: could not compile `auto-merge-dependabot-pull-requests-webhook` (bin "auto-merge-dependabot-pull-requests-webhook") due to 2 previous errors ``` </details> try-job: dist-various-1 try-job: aarch64-msvc-1
If a user does e.g.
and get a compilation error about that
From<Bar>
is not implemented forFoo
, check if multiple versions of the crate withFoo
is present in the dependency graph. If so, give a hint about it.Note that a test is added as a separate commit so it is easy to see what effect the fix has on the emitted error message.
This can be seen as a continuation of #124944.
I think this closes RUST-71693 but I haven't checked since it lacks a minimal reproducer. If this gets merged I'll ask that reporter if this fix works for them.
Real world example
I encountered this case in the wild and didn't realize I had multiple versions of a crate in my dependency graph. So I was a bit confused at first. For reference, here is what that looked like.
Click to expand
Before fix
After fix
try-job: dist-various-1
try-job: aarch64-msvc-1