Releases: pietroalbini/rust
Releases · pietroalbini/rust
Rust 1.27.2
Compatibility Notes
- The borrow checker was fixed to avoid potential unsoundness when using match ergonomics: #52213.
Rust 1.27.1
Security Notes
-
rustdoc would execute plugins in the /tmp/rustdoc/plugins directory when running, which enabled executing code as some other user on a given machine. This release fixes that vulnerability; you can read more about this on the blog. The associated CVE is CVE-2018-1000622.
Thank you to Red Hat for responsibly disclosing this vulnerability to us.
Compatibility Notes
Rust 1.27.0
Language
- Removed 'proc' from the reserved keywords list. This allows
proc
to be used as an identifier. - The dyn syntax is now available. This syntax is equivalent to the bare
Trait
syntax, and should make it clearer when being used in tandem withimpl Trait
because it is equivalent to the following syntax:&Trait == &dyn Trait
,&mut Trait == &mut dyn Trait
, andBox<Trait> == Box<dyn Trait>
. - Attributes on generic parameters such as types and lifetimes are now stable. e.g.
fn foo<#[lifetime_attr] 'a, #[type_attr] T: 'a>() {}
- The
#[must_use]
attribute can now also be used on functions as well as types. It provides a lint that by default warns users when the value returned by a function has not been used.
Compiler
Libraries
- SIMD (Single Instruction Multiple Data) on x86/x86_64 is now stable. This includes
arch::x86
&arch::x86_64
modules which contain SIMD intrinsics, a new macro calledis_x86_feature_detected!
, the#[target_feature(enable="")]
attribute, and addingtarget_feature = ""
to thecfg
attribute. - A lot of methods for
[u8]
,f32
, andf64
previously only available in std are now available in core. - The generic
Rhs
type parameter onops::{Shl, ShlAssign, Shr}
now defaults toSelf
. std::str::replace
now has the#[must_use]
attribute to clarify that the operation isn't done in place.Clone::clone
,Iterator::collect
, andToOwned::to_owned
now have the#[must_use]
attribute to warn about unused potentially expensive allocations.
Stabilized APIs
DoubleEndedIterator::rfind
DoubleEndedIterator::rfold
DoubleEndedIterator::try_rfold
Duration::from_micros
Duration::from_nanos
Duration::subsec_micros
Duration::subsec_millis
HashMap::remove_entry
Iterator::try_fold
Iterator::try_for_each
NonNull::cast
Option::filter
String::replace_range
Take::set_limit
hint::unreachable_unchecked
os::unix::process::parent_id
ptr::swap_nonoverlapping
slice::rsplit_mut
slice::rsplit
slice::swap_with_slice
Cargo
cargo-metadata
now includesauthors
,categories
,keywords
,readme
, andrepository
fields.cargo-metadata
now includes a package'smetadata
table.- Added the
--target-dir
optional argument. This allows you to specify a different directory thantarget
for placing compilation artifacts. - Cargo will be adding automatic target inference for binaries, benchmarks, examples, and tests in the Rust 2018 edition. If your project specifies specific targets, e.g. using
[[bin]]
, and have other binaries in locations where cargo would infer a binary, Cargo will produce a warning. You can disable this feature ahead of time by setting any of the following to false:autobins
,autobenches
,autoexamples
,autotests
. - Cargo will now cache compiler information. This can be disabled by setting
CARGO_CACHE_RUSTC_INFO=0
in your environment.
Misc
- Added “The Rustc book” into the official documentation. “The Rustc book” documents and teaches how to use the rustc compiler.
- All books available on
doc.rust-lang.org
are now searchable.
Compatibility Notes
- Calling a
CharExt
orStrExt
method directly on core will no longer work. e.g.::core::prelude::v1::StrExt::is_empty("")
will not compile,"".is_empty()
will still compile. Debug
output onatomic::{AtomicBool, AtomicIsize, AtomicPtr, AtomicUsize}
will only print the inner type. E.g.print!("{:?}", AtomicBool::new(true))
will printtrue
, notAtomicBool(true)
.- The maximum number for
repr(align(N))
is now 2²⁹. Previously you could enter higher numbers but they were not supported by LLVM. Up to 512MB alignment should cover all use cases. - The
.description()
method on thestd::error::Error
trait has been soft-deprecated. It is no longer required to implement it.
Rust 1.26.2
Rust 1.26.1
Tools
Compatibility Notes
Rust 1.26.0
Language
- Closures now implement
Copy
and/orClone
if all captured variables implement either or both traits. - The inclusive range syntax e.g.
for x in 0..=10
is now stable. - The
'_
lifetime is now stable. The underscore lifetime can be used anywhere a lifetime can be elided. impl Trait
is now stable allowing you to have abstract types in returns or in function parameters. E.g.fn foo() -> impl Iterator<Item=u8>
orfn open(path: impl AsRef<Path>)
.- Pattern matching will now automatically apply dereferences.
- 128-bit integers in the form of
u128
andi128
are now stable. main
can now returnResult<(), E: Debug>
in addition to()
.- A lot of operations are now available in a const context. E.g. You can now index into constant arrays, reference and dereference into constants, and use tuple struct constructors.
- Fixed entry slice patterns are now stable. E.g.
let points = [1, 2, 3, 4]; match points { [1, 2, 3, 4] => println!("All points were sequential."), _ => println!("Not all points were sequential."), }
Compiler
- LLD is now used as the default linker for
wasm32-unknown-unknown
. - Fixed exponential projection complexity on nested types. This can provide up to a ~12% reduction in compile times for certain crates.
- Added the
--remap-path-prefix
option to rustc. Allowing you to remap path prefixes outputted by the compiler. - Added
powerpc-unknown-netbsd
target.
Libraries
- Implemented
From<u16> for usize
&From<{u8, i16}> for isize
. - Added hexadecimal formatting for integers with fmt::Debug e.g.
assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")
- Implemented
Default, Hash
forcmp::Reverse
. - Optimized
str::repeat
being 8x faster in large cases. ascii::escape_default
is now available in libcore.- Trailing commas are now supported in std and core macros.
- Implemented
Copy, Clone
forcmp::Reverse
- Implemented
Clone
forchar::{ToLowercase, ToUppercase}
.
Stabilized APIs
*const T::add
*const T::copy_to_nonoverlapping
*const T::copy_to
*const T::read_unaligned
*const T::read_volatile
*const T::read
*const T::sub
*const T::wrapping_add
*const T::wrapping_sub
*mut T::add
*mut T::copy_to_nonoverlapping
*mut T::copy_to
*mut T::read_unaligned
*mut T::read_volatile
*mut T::read
*mut T::replace
*mut T::sub
*mut T::swap
*mut T::wrapping_add
*mut T::wrapping_sub
*mut T::write_bytes
*mut T::write_unaligned
*mut T::write_volatile
*mut T::write
Box::leak
FromUtf8Error::as_bytes
LocalKey::try_with
Option::cloned
btree_map::Entry::and_modify
fs::read_to_string
fs::read
fs::write
hash_map::Entry::and_modify
iter::FusedIterator
ops::RangeInclusive
ops::RangeToInclusive
process::id
slice::rotate_left
slice::rotate_right
String::retain
Cargo
- Cargo will now output path to custom commands when
-v
is passed with--list
- The Cargo binary version is now the same as the Rust version
Misc
Compatibility Notes
- aliasing a
Fn
trait asdyn
no longer works. E.g. the following syntax is now invalid.
use std::ops::Fn as dyn;
fn g(_: Box<dyn(std::fmt::Debug)>) {} - The result of dereferences are no longer promoted to
'static
. e.g.fn main() { const PAIR: &(i32, i32) = &(0, 1); let _reversed_pair: &'static _ = &(PAIR.1, PAIR.0); // Doesn't work }
- Deprecate
AsciiExt
trait in favor of inherent methods. ".e0"
will now no longer parse as0.0
and will instead cause an error.- Removed hoedown from rustdoc.
- Bounds on higher-kinded lifetimes a hard error.
Rust 1.25.0
Language
- The
#[repr(align(x))]
attribute is now stable. RFC 1358 - You can now use nested groups of imports. e.g.
use std::{fs::File, io::Read, path::{Path, PathBuf}};
- You can now have
|
at the start of a match arm. e.g.
enum Foo { A, B, C }
fn main() {
let x = Foo::A;
match x {
| Foo::A
| Foo::B => println!("AB"),
| Foo::C => println!("C"),
}
}
Compiler
Libraries
- Impl Send for
process::Command
on Unix. - Impl PartialEq and Eq for
ParseCharError
. UnsafeCell::into_inner
is now safe.- Implement libstd for CloudABI.
Float::{from_bits, to_bits}
is now available in libcore.- Implement
AsRef<Path>
for Component - Implemented
Write
forCursor<&mut Vec<u8>>
- Moved
Duration
to libcore.
Stabilized APIs
The following functions can now be used in a constant expression. eg. static MINUTE: Duration = Duration::from_secs(60);
Cargo
cargo new
no longer removesrust
orrs
prefixs/suffixs.cargo new
now defaults to creating a binary crate, instead of a library crate.
Misc
Compatibility Notes
- Deprecated
net::lookup_host
. rustdoc
has switched to pulldown as the default markdown renderer.- The borrow checker was sometimes incorrectly permitting overlapping borrows around indexing operations (see #47349). This has been fixed (which also enabled some correct code that used to cause errors (e.g. #33903 and #46095).
- Removed deprecated unstable attribute
#[simd]
.
Rust 1.24.1
Rust 1.24.0
Language
- External
sysv64
ffi is now available. eg.extern "sysv64" fn foo () {}
Compiler
- rustc now uses 16 codegen units by default for release builds. For the fastest builds, utilize
codegen-units=1
. - Added
armv4t-unknown-linux-gnueabi
target. - Add
aarch64-unknown-openbsd
support
Libraries
str::find::<char>
now uses memchr. This should lead to a 10x improvement in performance in the majority of cases.OsStr
'sDebug
implementation is now lossless and consistent with Windows.time::{SystemTime, Instant}
now implementHash
.- impl
From<bool>
forAtomicBool
- impl
From<{CString, &CStr}>
for{Arc<CStr>, Rc<CStr>}
- impl
From<{OsString, &OsStr}>
for{Arc<OsStr>, Rc<OsStr>}
- impl
From<{PathBuf, &Path}>
for{Arc<Path>, Rc<Path>}
- float::from_bits now just uses transmute. This provides some optimisations from LLVM.
- Copied
AsciiExt
methods ontochar
- Remove
T: Sized
requirement onptr::is_null()
- impl
From<RecvError>
for{TryRecvError, RecvTimeoutError}
- Optimised
f32::{min, max}
to generate more efficient x86 assembly [u8]::contains
now uses memchr which provides a 3x speed improvement
Stabilized APIs
The following functions can now be used in a constant expression. eg. let buffer: [u8; size_of::<usize>()];
, static COUNTER: AtomicUsize = AtomicUsize::new(1);
AtomicBool::new
AtomicUsize::new
AtomicIsize::new
AtomicPtr::new
Cell::new
{integer}::min_value
{integer}::max_value
mem::size_of
mem::align_of
ptr::null
ptr::null_mut
RefCell::new
UnsafeCell::new
Cargo
- Added a
workspace.default-members
config that overrides implied--all
in virtual workspaces. - Enable incremental by default on development builds. Also added configuration keys to
Cargo.toml
and.cargo/config
to disable on a per-project or global basis respectively.
Misc
Compatibility Notes
- Floating point types
Debug
impl now always prints a decimal point. Ipv6Addr
now rejects superfluous::
's in IPv6 addresses This is in accordance with IETF RFC 4291 §2.2.- Unwinding will no longer go past FFI boundaries, and will instead abort.
Formatter::flags
method is now deprecated. Thesign_plus
,sign_minus
,alternate
, andsign_aware_zero_pad
should be used instead.- Leading zeros in tuple struct members is now an error
column!()
macro is one-based instead of zero-basedfmt::Arguments
can no longer be shared across threads- Access to
#[repr(packed)]
struct fields is now unsafe - Cargo sets a different working directory for the compiler
Rust 1.23.0
Language
- Arbitrary
auto
traits are now permitted in trait objects. - rustc now uses subtyping on the left hand side of binary operations. Which should fix some confusing errors in some operations.
Compiler
- Enabled
TrapUnreachable
in LLVM which should mitigate the impact of undefined behavior. - rustc now suggests renaming import if names clash.
- Display errors/warnings correctly when there are zero-width or wide characters.
- rustc now avoids unnecessary copies of arguments that are simple bindings This should improve memory usage on average by 5-10%.
- Updated musl used to build musl rustc to 1.1.17
Libraries
- Allow a trailing comma in
assert_eq/ne
macro - Implement Hash for raw pointers to unsized types
- impl
From<*mut T>
forAtomicPtr<T>
- impl
From<usize/isize>
forAtomicUsize/AtomicIsize
. - Removed the
T: Sync
requirement forRwLock<T>: Send
- Removed
T: Sized
requirement for{<*const T>, <*mut T>}::as_ref
and<*mut T>::as_mut
- Optimized
Thread::{park, unpark}
implementation - Improved
SliceExt::binary_search
performance. - impl
FromIterator<()>
for()
- Copied
AsciiExt
trait methods to primitive types. Use ofAsciiExt
is now deprecated.
Stabilized APIs
Cargo
- Cargo now supports uninstallation of multiple packages eg.
cargo uninstall foo bar
uninstallsfoo
andbar
. - Added unit test checking to
cargo check
- Cargo now lets you install a specific version using
cargo install --version
Misc
- Releases now ship with the Cargo book documentation.
- rustdoc now prints rendering warnings on every run.
Compatibility Notes
- Changes have been made to type equality to make it more correct, in rare cases this could break some code. Tracking issue for further information
char::escape_debug
now uses Unicode 10 over 9.- Upgraded Android SDK to 27, and NDK to r15c. This drops support for Android 9, the minimum supported version is Android 14.
- Bumped the minimum LLVM to 3.9