Series: The Rust Annals

Vol. I Issue 98 nlopes.dev

Announcing Rust 1.97.0

Rust 1.97 makes the Rust-specific v0 symbol-mangling scheme the stable default, exposes successful-linker messages that may reveal real problems, and lets Cargo allow, warn on, or deny build warnings without invalidating the underlying build cache. The standard library also gains integer bit operations and several trait implementations, with char::is_control becoming usable in const contexts.

Rust-specific v0 symbol mangling becomes the stable default

Compiled items such as functions and statics need globally unique symbols. Rust therefore mangles their original names with context including the module path, defining crate, and generics. The historical scheme was based on the Itanium ABI, also sometimes used by C++.

The Rust-specific v0 scheme preserves the values of generic parameter instantiations instead of tracking them solely behind a hash. It also removes an inconsistency in the old scheme: not every component used the Itanium ABI, so custom demangling was still necessary.

Rust has supported opting into v0 with -Csymbol-mangling-version=v0 since 1.59, and v0 has been the nightly default since November 2025. Rust 1.97 completes the stable-channel step by enabling it there by default. The legacy scheme can now be selected only on nightly, and the current plan is to remove it fully. The earlier transition post has further details.

Successful links now surface potentially important linker messages

rustc invokes the linker, but previously silenced its output whenever linking succeeded. Because that could mask real problems, Rust 1.97 enables linker messages by default and emits them through a warning lint:

warning: linker stderr: ignoring deprecated linker optimization setting '1'
  |
  = note: `#[warn(linker_messages)]` on by default

rustc filters common messages already diagnosed as false positives or intentional behavior. Several defects were fixed after nightly stopped hiding this output.

For now, linker_messages is a special lint and is not affected by the warnings lint group. This is intentional: rustc does not generally control linker output as precisely, and some output appears only on certain platforms. Suspected false positives can be reported. In the meantime, projects can silence the lint through the Cargo manifest’s lints section:

[lints.rust]
linker_messages = "allow"

Cargo controls whether warnings fail a build without invalidating its cache

CI commonly denies warnings through RUSTFLAGS=-Dwarnings. Rust 1.97 instead lets Cargo control their effect on build success: allow silences warnings, the default warn level renders them without failing, and deny makes them fail the build.

Because this behavior is Cargo configuration, changing it does not invalidate the underlying build cache. During work such as fixing errors after a refactor, CARGO_BUILD_WARNINGS=allow cargo check temporarily suppresses warning noise. CI can use CARGO_BUILD_WARNINGS=deny; combining it with --keep-going collects all errors and warnings instead of stopping at the first failing package. The Cargo documentation describes the configuration.

The standard library adds bit operations, trait implementations, and one const API

The stabilized library inventory includes implementations of Default, Copy, and Send, plus operations for isolating or selecting the highest and lowest set bits and obtaining an unsigned integer’s bit width. The Send implementation for std::fs::File applies on UEFI.

The previously stable char::is_control is now also stable in const contexts.

Reproduced from the Rust blog under its publication licence. Typeset in Literata.