Description
What is being stabilized
-
!
is now a full-fledged type and can now be used in any type position (eg. RFC 1216). The!
type can coerce into any other type, see https://github.com/rust-lang/rust/tree/master/src/test/run-fail/adjust_never.rs for an example. -
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:// We didn't specify the type of `x`. Under some circumstances, type inference // will pick a type for us rather than erroring let x = Deserialize::deserialize(data);
Under the old rules this would deserialize a
()
, whereas under the new rules it will deserialize a!
. -
The
never_type
feature gate is stable, although some of the behaviours it used to gate now live behind the newexhaustive_patterns
feature gate (see below).
What is not being stabilized
-
Exhaustive pattern-matching for uninhabited types. eg.
let x: Result<u32, !> = ...; let Ok(y) = x;
This code will still complain that
Ok(_)
is a refutable pattern. This can be fixed by using theexhaustive_patterns
feature gate. See RFC 1872 for progress on this issue. See https://github.com/rust-lang/rust/tree/master/src/test/ui/feature-gate-exhaustive-patterns.rs for the testcase which confirms that this behaviour is still gated.