X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=RELEASES.md;h=e3597473f62fd17d9ace1d62f7ad9bfd345e2043;hb=6c94ceb691bf334043e3d679a17b0d30d788e43e;hp=53139877c2f92951a501dba60b494dafcd9aee02;hpb=fe969f4ec67a5bd317818cbc7a648c5795af15fa;p=rust.git diff --git a/RELEASES.md b/RELEASES.md index 53139877c2f..e3597473f62 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,140 @@ +Version 1.40.0 (2019-12-19) +=========================== + +Language +-------- +- [You can now use tuple `struct`s and tuple `enum` variant's constructors in + `const` contexts.][65188] e.g. + + ```rust + pub struct Point(i32, i32); + + const ORIGIN: Point = { + let constructor = Point; + + constructor(0, 0) + }; + ``` + +- [You can now mark `struct`s, `enum`s, and `enum` variants with the `#[non_exhaustive]` attribute to + indicate that there may be variants or fields added in the future.][64639] + For example this requires adding a wild-card branch (`_ => {}`) to any match + statements on a non-exhaustive `enum`. [(RFC 2008)] +- [You can now use function-like procedural macros in `extern` blocks and in + type positions.][63931] e.g. `type Generated = macro!();` +- [Function-like and attribute procedural macros can now emit + `macro_rules!` items, so you can now have your macros generate macros.][64035] +- [The `meta` pattern matcher in `macro_rules!` now correctly matches the modern + attribute syntax.][63674] For example `(#[$m:meta])` now matches `#[attr]`, + `#[attr{tokens}]`, `#[attr[tokens]]`, and `#[attr(tokens)]`. + +Compiler +-------- +- [Added tier 3 support\* for the + `thumbv7neon-unknown-linux-musleabihf` target.][66103] +- [Added tier 3 support for the + `aarch64-unknown-none-softfloat` target.][64589] +- [Added tier 3 support for the `mips64-unknown-linux-muslabi64`, and + `mips64el-unknown-linux-muslabi64` targets.][65843] + +\* Refer to Rust's [platform support page][forge-platform-support] for more + information on Rust's tiered platform support. + +Libraries +--------- +- [The `is_power_of_two` method on unsigned numeric types is now a `const` function.][65092] + +Stabilized APIs +--------------- +- [`BTreeMap::get_key_value`] +- [`HashMap::get_key_value`] +- [`Option::as_deref_mut`] +- [`Option::as_deref`] +- [`Option::flatten`] +- [`UdpSocket::peer_addr`] +- [`f32::to_be_bytes`] +- [`f32::to_le_bytes`] +- [`f32::to_ne_bytes`] +- [`f64::to_be_bytes`] +- [`f64::to_le_bytes`] +- [`f64::to_ne_bytes`] +- [`f32::from_be_bytes`] +- [`f32::from_le_bytes`] +- [`f32::from_ne_bytes`] +- [`f64::from_be_bytes`] +- [`f64::from_le_bytes`] +- [`f64::from_ne_bytes`] +- [`mem::take`] +- [`slice::repeat`] +- [`todo!`] + +Cargo +----- +- [Cargo will now always display warnings, rather than only on + fresh builds.][cargo/7450] +- [Feature flags (except `--all-features`) passed to a virtual workspace will + now produce an error.][cargo/7507] Previously these flags were ignored. +- [You can now publish `dev-dependencies` without including + a `version`.][cargo/7333] + +Misc +---- +- [You can now specify the `#[cfg(doctest)]` attribute to include an item only + when running documentation tests with `rustdoc`.][63803] + +Compatibility Notes +------------------- +- [As previously announced, any previous NLL warnings in the 2015 edition are + now hard errors.][64221] +- [The `include!` macro will now warn if it failed to include the + entire file.][64284] The `include!` macro unintentionally only includes the + first _expression_ in a file, and this can be unintuitive. This will become + either a hard error in a future release, or the behavior may be fixed to include all expressions as expected. +- [Using `#[inline]` on function prototypes and consts now emits a warning under + `unused_attribute` lint.][65294] Using `#[inline]` anywhere else inside traits + or `extern` blocks now correctly emits a hard error. + +[65294]: https://github.com/rust-lang/rust/pull/65294/ +[66103]: https://github.com/rust-lang/rust/pull/66103/ +[65843]: https://github.com/rust-lang/rust/pull/65843/ +[65188]: https://github.com/rust-lang/rust/pull/65188/ +[65092]: https://github.com/rust-lang/rust/pull/65092/ +[64589]: https://github.com/rust-lang/rust/pull/64589/ +[64639]: https://github.com/rust-lang/rust/pull/64639/ +[64221]: https://github.com/rust-lang/rust/pull/64221/ +[64284]: https://github.com/rust-lang/rust/pull/64284/ +[63931]: https://github.com/rust-lang/rust/pull/63931/ +[64035]: https://github.com/rust-lang/rust/pull/64035/ +[63674]: https://github.com/rust-lang/rust/pull/63674/ +[63803]: https://github.com/rust-lang/rust/pull/63803/ +[cargo/7450]: https://github.com/rust-lang/cargo/pull/7450/ +[cargo/7507]: https://github.com/rust-lang/cargo/pull/7507/ +[cargo/7525]: https://github.com/rust-lang/cargo/pull/7525/ +[cargo/7333]: https://github.com/rust-lang/cargo/pull/7333/ +[(rfc 2008)]: https://rust-lang.github.io/rfcs/2008-non-exhaustive.html +[`f32::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_be_bytes +[`f32::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_le_bytes +[`f32::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_ne_bytes +[`f64::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_be_bytes +[`f64::to_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_le_bytes +[`f64::to_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_ne_bytes +[`f32::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_be_bytes +[`f32::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_le_bytes +[`f32::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.from_ne_bytes +[`f64::from_be_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_be_bytes +[`f64::from_le_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_le_bytes +[`f64::from_ne_bytes`]: https://doc.rust-lang.org/std/primitive.f64.html#method.from_ne_bytes +[`option::flatten`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.flatten +[`option::as_deref`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref +[`option::as_deref_mut`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.as_deref_mut +[`hashmap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get_key_value +[`btreemap::get_key_value`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html#method.get_key_value +[`slice::repeat`]: https://doc.rust-lang.org/std/primitive.slice.html#method.repeat +[`mem::take`]: https://doc.rust-lang.org/std/mem/fn.take.html +[`udpsocket::peer_addr`]: https://doc.rust-lang.org/std/net/struct.UdpSocket.html#method.peer_addr +[`todo!`]: https://doc.rust-lang.org/std/macro.todo.html + + Version 1.39.0 (2019-11-07) =========================== @@ -4814,10 +4951,10 @@ Stabilized APIs --------------- * [`std::panic`] -* [`std::panic::catch_unwind`][] (renamed from `recover`) -* [`std::panic::resume_unwind`][] (renamed from `propagate`) -* [`std::panic::AssertUnwindSafe`][] (renamed from `AssertRecoverSafe`) -* [`std::panic::UnwindSafe`][] (renamed from `RecoverSafe`) +* [`std::panic::catch_unwind`] (renamed from `recover`) +* [`std::panic::resume_unwind`] (renamed from `propagate`) +* [`std::panic::AssertUnwindSafe`] (renamed from `AssertRecoverSafe`) +* [`std::panic::UnwindSafe`] (renamed from `RecoverSafe`) * [`str::is_char_boundary`] * [`<*const T>::as_ref`] * [`<*mut T>::as_ref`] @@ -5097,18 +5234,18 @@ Libraries --------- * Stabilized APIs: - * [`str::encode_utf16`][] (renamed from `utf16_units`) - * [`str::EncodeUtf16`][] (renamed from `Utf16Units`) + * [`str::encode_utf16`] (renamed from `utf16_units`) + * [`str::EncodeUtf16`] (renamed from `Utf16Units`) * [`Ref::map`] * [`RefMut::map`] * [`ptr::drop_in_place`] * [`time::Instant`] * [`time::SystemTime`] * [`Instant::now`] - * [`Instant::duration_since`][] (renamed from `duration_from_earlier`) + * [`Instant::duration_since`] (renamed from `duration_from_earlier`) * [`Instant::elapsed`] * [`SystemTime::now`] - * [`SystemTime::duration_since`][] (renamed from `duration_from_earlier`) + * [`SystemTime::duration_since`] (renamed from `duration_from_earlier`) * [`SystemTime::elapsed`] * Various `Add`/`Sub` impls for `Time` and `SystemTime` * [`SystemTimeError`] @@ -5295,8 +5432,8 @@ Libraries * Stabilized APIs * `Path` - * [`Path::strip_prefix`][] (renamed from relative_from) - * [`path::StripPrefixError`][] (new error type returned from strip_prefix) + * [`Path::strip_prefix`] (renamed from relative_from) + * [`path::StripPrefixError`] (new error type returned from strip_prefix) * `Ipv4Addr` * [`Ipv4Addr::is_loopback`] * [`Ipv4Addr::is_private`] @@ -5509,7 +5646,7 @@ Libraries * Stabilized APIs: [`Read::read_exact`], - [`ErrorKind::UnexpectedEof`][] (renamed from `UnexpectedEOF`), + [`ErrorKind::UnexpectedEof`] (renamed from `UnexpectedEOF`), [`fs::DirBuilder`], [`fs::DirBuilder::new`], [`fs::DirBuilder::recursive`], [`fs::DirBuilder::create`], [`os::unix::fs::DirBuilderExt`], @@ -5522,11 +5659,11 @@ Libraries [`collections::hash_set::HashSet::drain`], [`collections::binary_heap::Drain`], [`collections::binary_heap::BinaryHeap::drain`], - [`Vec::extend_from_slice`][] (renamed from `push_all`), + [`Vec::extend_from_slice`] (renamed from `push_all`), [`Mutex::get_mut`], [`Mutex::into_inner`], [`RwLock::get_mut`], [`RwLock::into_inner`], - [`Iterator::min_by_key`][] (renamed from `min_by`), - [`Iterator::max_by_key`][] (renamed from `max_by`). + [`Iterator::min_by_key`] (renamed from `min_by`), + [`Iterator::max_by_key`] (renamed from `max_by`). * The [core library][1.6co] is stable, as are most of its APIs. * [The `assert_eq!` macro supports arguments that don't implement `Sized`][1.6ae], such as arrays. In this way it behaves more like