-
Notifications
You must be signed in to change notification settings - Fork 12.7k
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
Defaulted unit types no longer error out (regression?) #51125
Comments
Triage: Even though the issue is old, it seems serious enough to be formally marked as a regression. So I added a regression label. |
So the issue is how desugating of The code in the issue description gets desugared to something like this (heavily simplified) (I've renamed types/variables for clarity): struct E;
fn load<T: Default>() -> Result<T, E> { ... }
fn foo() -> Result<(), E> {
let v = match load() {
Ok(val) => val,
Err(err) => return Err(err),
};
Ok(())
} In this desugared form it's clear that
fn foo() -> Result<(), E> {
let v = {
let ret;
match load() {
Ok(val) => ret = val,
Err(err) => return Err(err),
};
ret
};
Ok(())
} To eliminate the Upd: this desugaring does not work, because it changes the way |
…-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
This currently compiles (on stable and nightly). Till 1.25, it would trigger a lint because it has inference default to
()
instead of throwing an error.(playpen)
That lint indicates that it would become a hard error in the future, but it's not erroring. It seems like a bunch of this was changed when we stabilized
!
.That issue says
Though this doesn't really make sense, this looks like a safe way to produce nevers, which should, in short, never happen. It seems like this is related to #40801 -- but that was closed as it seems to be a more drastic change.
Also, if you print
val
, it's clear that the compiler thought it was a unit type. This seems like one of those cases where attempting to observe the situation changes it.We should have a hard error here, this looks like a footgun, and as @SimonSapin mentioned has broken some unsafe code already. We had an upgrade lint for the hard error and we'll need to reintroduce it for a cycle or two since we've had a release without it. AFAICT this is a less drastic change than #40801, and we seem to have intended for this to be a hard error before so it probably is minor enough that it's fine.
cc @nikomatsakis @eddyb
h/t @spacekookie for finding this
The text was updated successfully, but these errors were encountered: