-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Tracking issue for future-incompatibility lint resolve_trait_on_defaulted_unit
#39216
Comments
Is there any hope of treating Has this already been discussed elsewhere? I don't see any links in your comment. |
FWIW futures-rs ran into this warning and I found it pretty hard to fix, I was just randomly annotating unknown types until I finally found that location in the commit. Also out of curiosity, what PR was this introduced with? |
@dtolnay: @eddyb and @nikomatsakis have brought that idea up before and they might have an opinion on whether it's worth trying to implement. @alexcrichton: This was added in #39009. I guess the diagnostics will need to be improved :/ |
@alexcrichton hmm, yeah, that's frustrating; we're not super good at highlighting where a type annotation is needed, though we've been getting somewhat better. Maybe "closure return type" would make a good example. |
Thanks for the extensive write-up. petgraph's test suite triggered this in: warning: code relies on type inference rules which are likely to change
--> src/algo/dominators.rs:260:9
|
260 | assert_eq!(None, doms.dominators(99).map(|_| unreachable!()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(resolve_trait_on_defaulted_unit)] on by default
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #39216 <https://github.com/rust-lang/rust/issues/39216>
= note: this error originates in a macro outside of the current crate Solution is to use for example petgraph might have the record in running into most Rust breaking changes ever. |
I've got to this issue from a compiler message when trying some serde/serde_json workaround, and I noticed the message still says the problem will become a hard error. Well, it is a hard error already :) I'm thinking the message should be reworded perhaps? |
@Xion it is not, but we are starting to move towards making it so. |
Fixes so the compiler can infer msg_send! return types Currently, due to a quirk in Rust's type inference interacting with the structure of the `msg_send!` macro, a `()` return type will be inferred when the compiler cannot otherwise determine the return type. This behavior is expected to change, and in the future could resolve to a `!` return type, which results in undefined behavior. Linting has previously been added for this in rust-lang/rust#39216, but it did not catch these cases due to SSheldon/rust-objc#62. An upcoming version of objc will be fixed to stop hiding these errors, at which point they will become compile errors. This change fixes these errors and allows cocoa to compile with the fixed version of objc.
Fixes so the compiler can infer msg_send! return types (backport to 0.18) This is a backport of #340 onto the 0.18 release. Currently, due to a quirk in Rust's type inference interacting with the structure of the `msg_send!` macro, a `()` return type will be inferred when the compiler cannot otherwise determine the return type. This behavior is expected to change, and in the future could resolve to a `!` return type, which results in undefined behavior. Linting has previously been added for this in rust-lang/rust#39216, but it did not catch these cases due to SSheldon/rust-objc#62. An upcoming version of objc will be fixed to stop hiding these errors, at which point they will become compile errors. This change fixes these errors and allows cocoa to compile with the fixed version of objc.
* Fix so the compiler can infer msg_send! return type Currently, due to a quirk in Rust's type inference interacting with the structure of the msg_send! macro, a () return type will be inferred when the compiler cannot otherwise determine the return type. This behavior is expected to change, and in the future could resolve to a ! return type, which results in undefined behavior. Linting has previously been added for this in rust-lang/rust#39216, but it did not catch these cases due to SSheldon/rust-objc#62. An upcoming version of objc will be fixed to stop hiding these errors, at which point they will become compile errors. This change fixes these errors and allows winit to compile with the fixed version of objc. * Bump cocoa to 0.19.1
Currently, due to a quirk in Rust's type inference interacting with the structure of the msg_send! macro, a () return type will be inferred when the compiler cannot otherwise determine the return type. This behavior is expected to change, and in the future could resolve to a ! return type, which results in undefined behavior. Linting has previously been added for this in rust-lang/rust#39216, but it did not catch these cases due to SSheldon/rust-objc#62. objc has been fixed to stop hiding these errors as of version 0.2.7, and they are now compile errors. This change fixes these errors and allows compiling with the latest version of objc.
…1227) * Fix so the compiler can infer msg_send! return type Currently, due to a quirk in Rust's type inference interacting with the structure of the msg_send! macro, a () return type will be inferred when the compiler cannot otherwise determine the return type. This behavior is expected to change, and in the future could resolve to a ! return type, which results in undefined behavior. Linting has previously been added for this in rust-lang/rust#39216, but it did not catch these cases due to SSheldon/rust-objc#62. An upcoming version of objc will be fixed to stop hiding these errors, at which point they will become compile errors. This change fixes these errors and allows winit to compile with the fixed version of objc. * Bump cocoa to 0.19.1
…-operator-to-not-screw-with-inference-will-it-obey, r=<try> Stop skewing inference in ?'s desugaring **NB**: this is a breaking change (although arguably a bug fix) and as such shouldn't be taken lightly. This changes `expr?`'s desugaring like so (simplified, see code for more info): ```rust // old match expr { Ok(val) => val, Err(err) => return Err(err), } // new match expr { Ok(val) => val, Err(err) => core::convert::absurd(return Err(err)), } // core::convert pub const fn absurd<T>(x: !) -> T { x } ``` This prevents `!` from the `return` from skewing inference: ```rust // previously: ok (never type spontaneous decay skews inference, `T = ()`) // with this pr: can't infer the type for `T` Err(())?; ``` Fixes rust-lang#51125 Closes rust-lang#39216
…-operator-to-not-screw-with-inference-will-it-obey, r=<try> Stop skewing inference in ?'s desugaring **NB**: this is a breaking change (although arguably a bug fix) and as such shouldn't be taken lightly. This changes `expr?`'s desugaring like so (simplified, see code for more info): ```rust // old match expr { Ok(val) => val, Err(err) => return Err(err), } // new match expr { Ok(val) => val, Err(err) => core::convert::absurd(return Err(err)), } // core::convert pub const fn absurd<T>(x: !) -> T { x } ``` This prevents `!` from the `return` from skewing inference: ```rust // previously: ok (never type spontaneous decay skews inference, `T = ()`) // with this pr: can't infer the type for `T` Err(())?; ``` Fixes rust-lang#51125 Closes rust-lang#39216
…-operator-to-not-screw-with-inference-will-it-obey, r=<try> Stop skewing inference in ?'s desugaring **NB**: this is a breaking change (although arguably a bug fix) and as such shouldn't be taken lightly. This changes `expr?`'s desugaring like so (simplified, see code for more info): ```rust // old match expr { Ok(val) => val, Err(err) => return Err(err), } // new match expr { Ok(val) => val, Err(err) => core::convert::absurd(return Err(err)), } // core::convert pub const fn absurd<T>(x: !) -> T { x } ``` This prevents `!` from the `return` from skewing inference: ```rust // previously: ok (never type spontaneous decay skews inference, `T = ()`) // with this pr: can't infer the type for `T` Err(())?; ``` Fixes rust-lang#51125 Closes rust-lang#39216
resolve_trait_on_defaulted_unit
compatibility lintresolve_trait_on_defaulted_unit
The lint We now have the future-incompatibility lint |
@fmease yes, I believe |
This is the summary issue for the
resolve_trait_on_defaulted_unit
future-compatibility warning and other related errors. The goal of this page is describe why this change was made and how you can fix code that is affected by it. It also provides a place to ask questions or register a complaint if you feel the change should not be made. For more information on the policy around future-compatibility warnings, see our breaking change policy guidelines.What is this lint about
Ordinarily, when a user doesn't specify the type of an expression and the type cannot be inferred, rust will raise an error. For example, consider this code:
Because we haven't specified the type of
_
the compiler doesn't know what type of value the user is asking for a default of. And so we get this error:However, due to an unfortunate quirk in Rust's type inference algorithms it is sometimes possible to sneak situations like this past the compiler. In these cases, the unspecified type is defaulted to
()
. For an example of this, you can try deserializing an unspecified type with serde:In this case, the code will compile and will deserialize a value of type
()
.This behaviour is set to change with the eventual rolling-out of
feature(never_type)
. Where defaulting is still used types will instead default to!
. In the best case, code that currently relies on unspecified types defaulting to()
will stop compiling. In the worst case, code will continue to compile but may execute differently, as in the above example where a!
will be deserialised instead.The
resolve_trait_on_defaulted_unit
warning is raised wherever the compiler thinks your program's behaviour may depend on the current defaulting rules.How to fix this warning/error
Be specific about what type you're using. In the serde example above this could be done by simply adding a type annotation:
Current status
resolve_trait_on_defaulted_unit
lint as warn-by-defaultresolve_trait_on_defaulted_unit
lint deny-by-defaultresolve_trait_on_defaulted_unit
lint a hard errorThe text was updated successfully, but these errors were encountered: