Rust 1.99 lets you define C-style variadic functions in Rust itself
The Rust team released Rust 1.99.0 on 1 October. It is available through rustup update stable.
The main feature closes a long-standing gap in interoperability with C. Rust could already call variadic functions defined elsewhere, such as libc::printf, which take a variable number of arguments. From 1.99, such functions can be defined in Rust with the "C" and "C-unwind" ABIs, using a variable argument list .... The arguments are read through a VaList type that is ABI-compatible with C's va_list across targets, and the types that can be read from it are restricted. The release also stabilises naked variadic functions for other ABIs, which must be written with inline assembly.
A second change settles the safety requirements for retrieving the size and alignment behind raw pointers. That was already possible on stable for Sized types; three newly stabilised functions extend it to unsized types.
The release also changes guidance rather than behaviour. The documentation for Box::leak now recommends against patterns that later deallocate the leaked memory. The team says such code was found to interact badly with current and potential compiler optimisations, and is especially problematic with the upcoming stabilisation of custom allocators. Box::into_non_null or Box::into_raw should be used instead, and the same advice applies to the other leak functions in the standard library. The announcement stresses that there are no changes to language semantics.

Why it matters
Variadic definitions remove a reason to keep small C shims in mixed Rust and C codebases, for example when exposing a callback or a logging function to a C library. The Box::leak note is the item to act on: code that leaks a box and later reconstructs it to free the memory still compiles, but the team is now saying it should not be written that way.