Releases: pietroalbini/rust
Releases · pietroalbini/rust
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
u8
that covers0..=255
and you would no longer be required to have a_ => unreachable!()
case. - You can now have multiple patterns in
if let
andwhile let
expressions. You can do this with the same syntax as amatch
expression. 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 let
andwhile let
patterns. Using this feature will by default produce a warning as this behaviour can be unintuitive. E.g.if let _ = 5 {}
- You can now use
let
bindings, 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_attr
attribute. 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
, andPin
as method receivers.
Compiler
- You can now set a linker flavor for
rustc
with the-Clinker-flavor
command 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-sgx
target 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-androideabi
andthumbv7neon-unknown-linux-gnueabihf
targets. - Added support for the
x86_64-unknown-uefi
target.
Libraries
- The methods
overflowing_{add, sub, mul, shl, shr}
are nowconst
functions for all numeric types. - The methods
rotate_left
,rotate_right
, andwrapping_{add, sub, mul, shl, shr}
are nowconst
functions for all numeric types. - The methods
is_positive
andis_negative
are nowconst
functions for all signed numeric types. - The
get
method for allNonZero
types is nowconst
. - The methods
count_ones
,count_zeros
,leading_zeros
,trailing_zeros
,swap_bytes
,from_be
,from_le
,to_be
,to_le
are nowconst
for all numeric types. Ipv4Addr::new
is now aconst
function
Stabilized APIs
unix::FileExt::read_exact_at
unix::FileExt::write_all_at
Option::transpose
Result::transpose
convert::identity
pin::Pin
marker::Unpin
marker::PhantomPinned
Vec::resize_with
VecDeque::resize_with
Duration::as_millis
Duration::as_micros
Duration::as_nanos
Cargo
- You can now publish crates that require a feature flag to compile with
cargo publish --features
orcargo 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::cause
method has been deprecated in favor ofError::source
which 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
literal
specifier. 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 Trait
ordyn Trait
is 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-msvc
target.
Libraries
PathBuf
now 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_ptr
UnsafeCell::get
char::is_ascii
iter::empty
ManuallyDrop::new
ManuallyDrop::into_inner
RangeInclusive::start
RangeInclusive::end
NonNull::as_ptr
slice::as_ptr
str::as_ptr
Duration::as_secs
Duration::subsec_millis
Duration::subsec_micros
Duration::subsec_nanos
CStr::as_ptr
Ipv4Addr::is_unspecified
Ipv6Addr::new
Ipv6Addr::octets
Stabilized APIs
i8::to_be_bytes
i8::to_le_bytes
i8::to_ne_bytes
i8::from_be_bytes
i8::from_le_bytes
i8::from_ne_bytes
i16::to_be_bytes
i16::to_le_bytes
i16::to_ne_bytes
i16::from_be_bytes
i16::from_le_bytes
i16::from_ne_bytes
i32::to_be_bytes
i32::to_le_bytes
i32::to_ne_bytes
i32::from_be_bytes
i32::from_le_bytes
i32::from_ne_bytes
i64::to_be_bytes
i64::to_le_bytes
i64::to_ne_bytes
i64::from_be_bytes
i64::from_le_bytes
i64::from_ne_bytes
i128::to_be_bytes
i128::to_le_bytes
i128::to_ne_bytes
i128::from_be_bytes
i128::from_le_bytes
i128::from_ne_bytes
isize::to_be_bytes
isize::to_le_bytes
isize::to_ne_bytes
isize::from_be_bytes
isize::from_le_bytes
isize::from_ne_bytes
u8::to_be_bytes
u8::to_le_bytes
u8::to_ne_bytes
u8::from_be_bytes
u8::from_le_bytes
u8::from_ne_bytes
u16::to_be_bytes
u16::to_le_bytes
u16::to_ne_bytes
u16::from_be_bytes
u16::from_le_bytes
u16::from_ne_bytes
u32::to_be_bytes
u32::to_le_bytes
u32::to_ne_bytes
u32::from_be_bytes
u32::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
const
functions. 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 theFrom
trait. E.g.u8
now implementsFrom<NonZeroU8>
. - You can now convert a
&Option<T>
intoOption<&T>
and&mut Option<T>
intoOption<&mut T>
using theFrom
trait. - You can now multiply (
*
) atime::Duration
by au32
.
Stabilized APIs
slice::align_to
slice::align_to_mut
slice::chunks_exact
slice::chunks_exact_mut
slice::rchunks
slice::rchunks_mut
slice::rchunks_exact
slice::rchunks_exact_mut
Option::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
crate
in paths. This allows you to refer to the crate root in the path, e.g.use crate::foo;
refers tofoo
insrc/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
use
syntax. 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 thevis
specifier. - 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
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 run
doesn't require specifying a package in workspaces.cargo doc
now supports--message-format=json
. This is equivalent to callingrustdoc --error-format=json
.- Cargo will now provide a progress bar for builds.
Misc
rustdoc
allows you to specify what edition to treat your code as with the--edition
option.rustdoc
now has the--color
(specify whether to output color) and--error-format
(specify error format, e.g.json
) options.- We now distribute a
rust-gdbgui
script that invokesgdbgui
with Rust debug symbols. - Attributes from Rust tools such as
rustfmt
orclippy
are 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-preview
component on the windows-gnu targets has been restored.
Rust 1.29.1
Security Notes
-
The standard library's
str::repeat
function 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.
Rust 1.29.0
Compiler
- Bumped minimum LLVM version to 5.0.
- Added
powerpc64le-unknown-linux-musl
target. - Added
aarch64-unknown-hermit
andx86_64-unknown-hermit
targets.
Libraries
Once::call_once
no longer requiresOnce
to be'static
.BuildHasherDefault
now implementsPartialEq
andEq
.Box<CStr>
,Box<OsStr>
, andBox<Path>
now implementClone
.- Implemented
PartialEq<&str>
forOsString
andPartialEq<OsString>
for&str
. Cell<T>
now allowsT
to be unsized.SocketAddr
is now stable on Redox.
Stabilized APIs
Cargo
- Cargo can silently fix some bad lockfiles. You can use
--locked
to disable this behavior. cargo-install
will now allow you to cross compile an install using--target
.- Added the
cargo-fix
subcommand to automatically move project code from 2015 edition to 2018. cargo doc
can now optionally document private types using the--document-private-items
flag.
Misc
rustdoc
now has the--cap-lints
option which demotes all lints above the specified level to that level. For example--cap-lints warn
will demotedeny
andforbid
lints towarn
.rustc
andrustdoc
will now have the exit code of1
if compilation fails and101
if there is a panic.- A preview of clippy has been made available through rustup. You can install the preview with
rustup component add clippy-preview
.
Compatibility Notes
str::{slice_unchecked, slice_unchecked_mut}
are now deprecated. Usestr::get_unchecked(begin..end)
instead.std::env::home_dir
is now deprecated for its unintuitive behavior. Consider using thehome_dir
function from https://crates.io/crates/dirs instead.rustc
will no longer silently ignore invalid data in target spec.cfg
attributes and--cfg
command line flags are now more strictly validated.
Rust 1.28.0
Language
- The
#[repr(transparent)]
attribute is now stable. This attribute allows a Rust newtype wrapper (struct NewType<T>(T);
) to be represented as the inner type across Foreign Function Interface (FFI) boundaries. - The keywords
pure
,sizeof
,alignof
, andoffsetof
have been unreserved and can now be used as identifiers. - The
GlobalAlloc
trait and#[global_allocator]
attribute are now stable. This will allow users to specify a global allocator for their program. - Unit test functions marked with the
#[test]
attribute can now returnResult<(), E: Debug>
in addition to()
. - The
lifetime
specifier formacro_rules!
is now stable. This allows macros to easily target lifetimes.
Compiler
- The
s
andz
optimisation levels are now stable. These optimisations prioritise making smaller binary sizes.z
is the same ass
with the exception that it does not vectorise loops, which typically results in an even smaller binary. - The short error format is now stable. Specified with
--error-format=short
this option will provide a more compressed output of rust error messages. - Added a lint warning when you have duplicated
macro_export
s. - Reduced the number of allocations in the macro parser. This can improve compile times of macro heavy crates on average by 5%.
Libraries
- Implemented
Default
for&mut str
. - Implemented
From<bool>
for all integer and unsigned number types. - Implemented
Extend
for()
. - The
Debug
implementation oftime::Duration
should now be more easily human readable. Previously aDuration
of one second would printed asDuration { secs: 1, nanos: 0 }
and will now be printed as1s
. - Implemented
From<&String>
forCow<str>
,From<&Vec<T>>
forCow<[T]>
,From<Cow<CStr>>
forCString
,From<CString>, From<CStr>, From<&CString>
forCow<CStr>
,From<OsString>, From<OsStr>, From<&OsString>
forCow<OsStr>
,From<&PathBuf>
forCow<Path>
, andFrom<Cow<Path>>
forPathBuf
. - Implemented
Shl
andShr
forWrapping<u128>
andWrapping<i128>
. DirEntry::metadata
now usesfstatat
instead oflstat
when possible. This can provide up to a 40% speed increase.- Improved error messages when using
format!
.
Stabilized APIs
Iterator::step_by
Path::ancestors
SystemTime::UNIX_EPOCH
alloc::GlobalAlloc
alloc::Layout
alloc::LayoutErr
alloc::System
alloc::alloc
alloc::alloc_zeroed
alloc::dealloc
alloc::realloc
alloc::handle_alloc_error
btree_map::Entry::or_default
fmt::Alignment
hash_map::Entry::or_default
iter::repeat_with
num::NonZeroUsize
num::NonZeroU128
num::NonZeroU16
num::NonZeroU32
num::NonZeroU64
num::NonZeroU8
ops::RangeBounds
slice::SliceIndex
slice::from_mut
slice::from_ref
{Any + Send + Sync}::downcast_mut
{Any + Send + Sync}::downcast_ref
{Any + Send + Sync}::is
Cargo
- Cargo will now no longer allow you to publish crates with build scripts that modify the
src
directory. Thesrc
directory in a crate should be considered to be immutable.
Misc
- The
suggestion_applicability
field inrustc
's json output is now stable. This will allow dev tools to check whether a code suggestion would apply to them.
Compatibility Notes
- Rust will consider trait objects with duplicated constraints to be the same type as without the duplicated constraint. For example the below code will now fail to compile.
trait Trait {} impl Trait + Send { fn test(&self) { println!("one"); } //~ ERROR duplicate definitions with name `test` } impl Trait + Send + Send { fn test(&self) { println!("two"); } }