Releases: rust-lang/rust
Releases · rust-lang/rust
Rust 1.34.1
Rust 1.34.0
Language
- You can now use
#[deprecated = "reason"]as a shorthand for#[deprecated(note = "reason")]. This was previously allowed by mistake but had no effect. - You can now accept token streams in
#[attr()],#[attr[]], and#[attr{}]procedural macros. - You can now write
extern crate self as foo;to import your crate's root into the extern prelude.
Compiler
- You can now target
riscv64imac-unknown-none-elfandriscv64gc-unknown-none-elf. - You can now enable linker plugin LTO optimisations with
-C linker-plugin-lto. This allows rustc to compile your Rust code into LLVM bitcode allowing LLVM to perform LTO optimisations across C/C++ FFI boundaries. - You can now target
powerpc64-unknown-freebsd.
Libraries
- The trait bounds have been removed on some of
HashMap<K, V, S>'s andHashSet<T, S>'s basic methods. Most notably you no longer require theHashtrait to create an iterator. - The
Ordtrait bounds have been removed on some ofBinaryHeap<T>'s basic methods. Most notably you no longer require theOrdtrait to create an iterator. - The methods
overflowing_negandwrapping_negare nowconstfunctions for all numeric types. - Indexing a
stris now generic over all types that implementSliceIndex<str>. str::trim,str::trim_matches,str::trim_{start, end}, andstr::trim_{start, end}_matchesare now#[must_use]and will produce a warning if their returning type is unused.- The methods
checked_pow,saturating_pow,wrapping_pow, andoverflowing_poware now available for all numeric types. These are equivalent to methods such aswrapping_addfor thepowoperation.
Stabilized APIs
std & core
Any::type_idError::type_idatomic::AtomicI16atomic::AtomicI32atomic::AtomicI64atomic::AtomicI8atomic::AtomicU16atomic::AtomicU32atomic::AtomicU64atomic::AtomicU8convert::Infallibleconvert::TryFromconvert::TryIntoiter::from_fniter::successorsnum::NonZeroI128num::NonZeroI16num::NonZeroI32num::NonZeroI64num::NonZeroI8num::NonZeroIsizeslice::sort_by_cached_keystr::escape_debugstr::escape_defaultstr::escape_unicodestr::split_ascii_whitespace
std
Cargo
Misc
Compatibility Notes
Command::before_execis being replaced by the unsafe methodCommand::pre_execand will be deprecated with Rust 1.37.0.- Use of
ATOMIC_{BOOL, ISIZE, USIZE}_INITis now deprecated as you can now useconstfunctions instaticvariables.
Rust 1.33.0
Language
- You can now use the
cfg(target_vendor)attribute. E.g.#[cfg(target_vendor="apple")] fn main() { println!("Hello Apple!"); } - Integer patterns such as in a match expression can now be exhaustive. E.g. You can have match statement on a
u8that covers0..=255and you would no longer be required to have a_ => unreachable!()case. - You can now have multiple patterns in
if letandwhile letexpressions. You can do this with the same syntax as amatchexpression. E.g.enum Creature { Crab(String), Lobster(String), Person(String), } fn main() { let state = Creature::Crab("Ferris"); if let Creature::Crab(name) | Creature::Person(name) = state { println!("This creature's name is: {}", name); } }
- You can now have irrefutable
if letandwhile letpatterns. Using this feature will by default produce a warning as this behaviour can be unintuitive. E.g.if let _ = 5 {} - You can now use
letbindings, assignments, expression statements, and irrefutable pattern destructuring in const functions. - You can now call unsafe const functions. E.g.
const unsafe fn foo() -> i32 { 5 } const fn bar() -> i32 { unsafe { foo() } }
- You can now specify multiple attributes in a
cfg_attrattribute. E.g.#[cfg_attr(all(), must_use, optimize)] - You can now specify a specific alignment with the
#[repr(packed)]attribute. E.g.#[repr(packed(2))] struct Foo(i16, i32);is a struct with an alignment of 2 bytes and a size of 6 bytes. - You can now import an item from a module as an
_. This allows you to import a trait's impls, and not have the name in the namespace. E.g.use std::io::Read as _; // Allowed as there is only one `Read` in the module. pub trait Read {}
- You may now use
Rc,Arc, andPinas method receivers.
Compiler
- You can now set a linker flavor for
rustcwith the-Clinker-flavorcommand line argument. - The minimum required LLVM version has been bumped to 6.0.
- Added support for the PowerPC64 architecture on FreeBSD.
- The
x86_64-fortanix-unknown-sgxtarget support has been upgraded to tier 2 support. Visit the platform support page for information on Rust's platform support. - Added support for the
thumbv7neon-linux-androideabiandthumbv7neon-unknown-linux-gnueabihftargets. - Added support for the
x86_64-unknown-uefitarget.
Libraries
- The methods
overflowing_{add, sub, mul, shl, shr}are nowconstfunctions for all numeric types. - The methods
rotate_left,rotate_right, andwrapping_{add, sub, mul, shl, shr}are nowconstfunctions for all numeric types. - The methods
is_positiveandis_negativeare nowconstfunctions for all signed numeric types. - The
getmethod for allNonZerotypes is nowconst. - The methods
count_ones,count_zeros,leading_zeros,trailing_zeros,swap_bytes,from_be,from_le,to_be,to_leare nowconstfor all numeric types. Ipv4Addr::newis now aconstfunction
Stabilized APIs
unix::FileExt::read_exact_atunix::FileExt::write_all_atOption::transposeResult::transposeconvert::identitypin::Pinmarker::Unpinmarker::PhantomPinnedVec::resize_withVecDeque::resize_withDuration::as_millisDuration::as_microsDuration::as_nanos
Cargo
- You can now publish crates that require a feature flag to compile with
cargo publish --featuresorcargo publish --all-features. - Cargo should now rebuild a crate if a file was modified during the initial build.
Compatibility Notes
- The methods
str::{trim_left, trim_right, trim_left_matches, trim_right_matches}are now deprecated in the standard library, and their usage will now produce a warning. Please use thestr::{trim_start, trim_end, trim_start_matches, trim_end_matches}methods instead. - The
Error::causemethod has been deprecated in favor ofError::sourcewhich supports downcasting. - Libtest no longer creates a new thread for each test when
--test-threads=1. It also runs the tests in deterministic order
Rust 1.32.0
Language
2018 edition
- You can now use the
?operator in macro definitions. The?operator allows you to specify zero or one repetitions similar to the*and+operators. - Module paths with no leading keyword like
super,self, orcrate, will now always resolve to the item (enum,struct, etc.) available in the module if present, before resolving to a external crate or an item the prelude. E.g.enum Color { Red, Green, Blue } use Color::*;
All editions
- You can now match against
PhantomData<T>types. - You can now match against literals in macros with the
literalspecifier. This will match against a literal of any type. E.g.1,'A',"Hello World" - Self can now be used as a constructor and pattern for unit and tuple structs. E.g.
struct Point(i32, i32); impl Point { pub fn new(x: i32, y: i32) -> Self { Self(x, y) } pub fn is_origin(&self) -> bool { match self { Self(0, 0) => true, _ => false, } } }
- Self can also now be used in type definitions. E.g.
enum List<T> where Self: PartialOrd<Self> // can write `Self` instead of `List<T>` { Nil, Cons(T, Box<Self>) // likewise here }
- You can now mark traits with
#[must_use]. This provides a warning if aimpl Traitordyn Traitis returned and unused in the program.
Compiler
- The default allocator has changed from jemalloc to the default allocator on your system. The compiler itself on Linux & macOS will still use jemalloc, but programs compiled with it will use the system allocator.
- Added the
aarch64-pc-windows-msvctarget.
Libraries
PathBufnow implementsFromStr.Box<[T]>now implementsFromIterator<T>.- The
dbg!macro has been stabilized. This macro enables you to easily debug expressions in your rust program. E.g.let a = 2; let b = dbg!(a * 2) + 1; // ^-- prints: [src/main.rs:4] a * 2 = 4 assert_eq!(b, 5);
The following APIs are now const functions and can be used in a const context.
Cell::as_ptrUnsafeCell::getchar::is_asciiiter::emptyManuallyDrop::newManuallyDrop::into_innerRangeInclusive::startRangeInclusive::endNonNull::as_ptrslice::as_ptrstr::as_ptrDuration::as_secsDuration::subsec_millisDuration::subsec_microsDuration::subsec_nanosCStr::as_ptrIpv4Addr::is_unspecifiedIpv6Addr::newIpv6Addr::octets
Stabilized APIs
i8::to_be_bytesi8::to_le_bytesi8::to_ne_bytesi8::from_be_bytesi8::from_le_bytesi8::from_ne_bytesi16::to_be_bytesi16::to_le_bytesi16::to_ne_bytesi16::from_be_bytesi16::from_le_bytesi16::from_ne_bytesi32::to_be_bytesi32::to_le_bytesi32::to_ne_bytesi32::from_be_bytesi32::from_le_bytesi32::from_ne_bytesi64::to_be_bytesi64::to_le_bytesi64::to_ne_bytesi64::from_be_bytesi64::from_le_bytesi64::from_ne_bytesi128::to_be_bytesi128::to_le_bytesi128::to_ne_bytesi128::from_be_bytesi128::from_le_bytesi128::from_ne_bytesisize::to_be_bytesisize::to_le_bytesisize::to_ne_bytesisize::from_be_bytesisize::from_le_bytesisize::from_ne_bytesu8::to_be_bytesu8::to_le_bytesu8::to_ne_bytesu8::from_be_bytesu8::from_le_bytesu8::from_ne_bytesu16::to_be_bytesu16::to_le_bytesu16::to_ne_bytesu16::from_be_bytesu16::from_le_bytesu16::from_ne_bytesu32::to_be_bytesu32::to_le_bytesu32::to_ne_bytesu32::from_be_bytesu32::from_le_bytes- [
u32::from_ne_bytes](https://doc.rust-lang.org/stable/std/primitive....
Rust 1.31.1
Rust 1.31.0
Language
- 🎉 This version marks the release of the 2018 edition of Rust. 🎉
- New lifetime elision rules now allow for eliding lifetimes in functions and impl headers. E.g.
impl<'a> Reader for BufReader<'a> {}can now beimpl Reader for BufReader<'_> {}. Lifetimes are still required to be defined in structs. - You can now define and use
constfunctions. These are currently a strict minimal subset of the const fn RFC. Refer to the language reference for what exactly is available. - You can now use tool lints, which allow you to scope lints from external tools using attributes. E.g.
#[allow(clippy::filter_map)]. #[no_mangle]and#[export_name]attributes can now be located anywhere in a crate, not just in exported functions.- You can now use parentheses in pattern matches.
Compiler
Libraries
- You can now convert
num::NonZero*types to their raw equivalents using theFromtrait. E.g.u8now implementsFrom<NonZeroU8>. - You can now convert a
&Option<T>intoOption<&T>and&mut Option<T>intoOption<&mut T>using theFromtrait. - You can now multiply (
*) atime::Durationby au32.
Stabilized APIs
slice::align_toslice::align_to_mutslice::chunks_exactslice::chunks_exact_mutslice::rchunksslice::rchunks_mutslice::rchunks_exactslice::rchunks_exact_mutOption::replace
Cargo
Rust 1.30.1
Rust 1.30.0
Language
- Procedural macros are now available. These kinds of macros allow for more powerful code generation. There is a new chapter available in the Rust Programming Language book that goes further in depth.
- You can now use keywords as identifiers using the raw identifiers syntax (
r#), e.g.let r#for = true; - Using anonymous parameters in traits is now deprecated with a warning and will be a hard error in the 2018 edition.
- You can now use
cratein paths. This allows you to refer to the crate root in the path, e.g.use crate::foo;refers tofooinsrc/lib.rs. - Using a external crate no longer requires being prefixed with
::. Previously, using a external crate in a module without a use statement requiredlet json = ::serde_json::from_str(foo);but can now be written aslet json = serde_json::from_str(foo);. - You can now apply the
#[used]attribute to static items to prevent the compiler from optimising them away, even if they appear to be unused, e.g.#[used] static FOO: u32 = 1; - You can now import and reexport macros from other crates with the
usesyntax. Macros exported with#[macro_export]are now placed into the root module of the crate. If your macro relies on calling other local macros, it is recommended to export with the#[macro_export(local_inner_macros)]attribute so users won't have to import those macros. - You can now catch visibility keywords (e.g.
pub,pub(crate)) in macros using thevisspecifier. - Non-macro attributes now allow all forms of literals, not just strings. Previously, you would write
#[attr("true")], and you can now write#[attr(true)]. - You can now specify a function to handle a panic in the Rust runtime with the
#[panic_handler]attribute.
Compiler
- Added the
riscv32imc-unknown-none-elftarget. - Added the
aarch64-unknown-netbsdtarget - Upgraded to LLVM 8.
Libraries
Stabilized APIs
-
The following methods are replacement methods for
trim_left,trim_right,trim_left_matches, andtrim_right_matches, which will be deprecated in 1.33.0:
Cargo
cargo rundoesn't require specifying a package in workspaces.cargo docnow supports--message-format=json. This is equivalent to callingrustdoc --error-format=json.- Cargo will now provide a progress bar for builds.
Misc
rustdocallows you to specify what edition to treat your code as with the--editionoption.rustdocnow has the--color(specify whether to output color) and--error-format(specify error format, e.g.json) options.- We now distribute a
rust-gdbguiscript that invokesgdbguiwith Rust debug symbols. - Attributes from Rust tools such as
rustfmtorclippyare now available, e.g.#[rustfmt::skip]will skip formatting the next item.
Rust 1.29.2
- Workaround for an aliasing-related LLVM bug, which caused miscompilation.
- The
rls-previewcomponent on the windows-gnu targets has been restored.
Rust 1.29.1
Security Notes
-
The standard library's
str::repeatfunction contained an out of bounds write caused by an integer overflow. This has been fixed by deterministically panicking when an overflow happens.Thank you to Scott McMurray for responsibly disclosing this vulnerability to us.