Releases: rust-lang/rust
Releases · rust-lang/rust
Rust 1.34.2
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.