Rust 1.99 Stabilizes C-Variadic Function Definitions and Raw-Pointer Layout Queries, and Disables Cargo Incremental Builds in CI
Rust 1.99.0, released October 1, lets developers define C-ABI variadic functions in Rust, stabilizes raw-pointer size and alignment functions, and changes Cargo defaults.
Editor's Note ·
- Clarification:
- The headline says Rust 1.99 "Disables Cargo Incremental Builds in CI". The Rust 1.99.0 release notes say "incremental compilation is now disabled by default when running in CI. CI is detected via the `CI` environment variable." This is a changed default that applies when the CI environment variable is detected, not an unconditional removal of incremental builds.
Overview
The Rust Release Team announced Rust 1.99.0 on October 1, 2026, according to the Rust Blog. The release’s headline feature is the stabilization of C-ABI variadic function definitions, which means functions that take a variable argument list can now be written in Rust itself. Developers with a rustup installation can update with rustup update stable, per the same announcement.
What Changed
C-variadic functions
The Rust Blog says Rust 1.99.0 stabilizes defining C-ABI variadic functions with the “C” and “C-unwind” ABIs. Rust could already call externally-defined variadic functions such as libc::printf; the announcement says that with 1.99 “these functions can now be written in Rust itself”.
According to the same post, the type of the ... argument is VaList, which is ABI-compatible with the C va_list type across targets, and the types that can be read from a VaList are guarded by the VaArgSafe trait. The release also stabilizes support for defining naked variadic functions with non-”C” ABIs, which the Rust Blog says must be written via inline assembly.
Layout information from raw pointers
The Rust Blog says the release settles the safety requirements for retrieving the size and alignment of raw pointers to both Sized and non-Sized types. It does so by stabilizing three functions: Layout::for_value_raw, mem::size_of_val_raw and mem::align_of_val_raw.
Guidance against unleaking after Box::leak
The announcement states there are no changes to language semantics in 1.99, but the documentation on Box::leak now recommends against patterns that later deallocate the leaked memory. The Rust Blog says such code was found to have problematic interactions with current and future potential compiler optimizations, and is especially problematic with the upcoming stabilization of custom allocators. It recommends Box::into_non_null or Box::into_raw instead, and says the guidance also applies to other leak functions in the standard library.
Newly stable APIs
The Rust Blog lists among the stabilized APIs VecDeque::retain_back, Box::into_non_null, Box::from_non_null, Vec::into_parts, Vec::from_parts, String::from_utf8_lossy_owned, std::fs::set_times and std::fs::set_times_nofollow, along with IntoIterator implementations for Box<[T; N]>.
Cargo, Tooling and Platform Changes
The release notes for version 1.99.0 (2026-10-01) record several changes outside the language and standard library:
- Cargo and CI: incremental compilation is now disabled by default when running in CI, which Cargo detects through the
CIenvironment variable. - New
debugprofile: Cargo adds a built-in profile nameddebug. The notes describe it as preparation for transitioning thedevprofile away from debugging, and say there is currently no difference between thedevanddebugprofiles. - Workspace dependencies: workspace members on edition 2024 or later can now override an inherited workspace dependency’s
default-featuresfield. On earlier editions, the notes saydefault-features = falseis ignored with a warning. - Rustdoc: the notes say smarter filtering of trait impls yields performance improvements of 20% on average and up to 40% on some real-world crates.
- Platform support:
riscv64-unknown-linux-muslis promoted to Tier 2 with host tools. - Internals: the compiler updates to LLVM 23.
Compatibility Notes
The release notes also list items that may require attention when upgrading. The legacy integral modules are fully deprecated, so std::i32::MAX should be accessed as i32::MAX. The no_mangle_generic_items lint is upgraded into a hard error.
What We Don’t Know
The release materials reviewed do not say how many crates in the wider ecosystem currently depend on the behaviors changed in the compatibility notes, nor whether the Cargo debug profile will become distinct from dev in a specific future release. The announcement refers to an upcoming stabilization of custom allocators but does not give a timeline.