Type inference will now default unconstrained type variables to ! instead of (). The resolve_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 new exhaustive_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 the exhaustive_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.