rust
rust copied to clipboard
Defaulted unit types no longer error out (regression?)
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.
fn main() {}
struct Err;
fn load<T: Default>() -> Result<T, Err> {
Ok(T::default())
}
fn foo() -> Result<(), Err> {
let val = load()?; // defaults to ()
Ok(())
}
(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
Type inference will now default unconstrained type variables to
!
instead of()
. Theresolve_trait_on_defaulted_unit
lint has been retired. An example of where this comes up is if you have something like:
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 https://github.com/rust-lang/rust/issues/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