Publication de la version Rust 1.96.0 — une nouvelle version stable du langage de programmation Rust. La mise à jour est sortie 28 mai 2026; vous pouvez l'installer avec la commande standard rustup update stable. Les changements principaux incluent de nouveaux types de plages dans core::range, la stabilisation des macros pour vérifier les correspondances avec des modèles, un renforcement du comportement des assemblages WebAssembly et des corrections de deux vulnérabilités dans Cargo.
Principales modifications
Nouveaux types de plages core::range::Range*.
De nouvelles variantes de plages ont été stabilisées dans la bibliothèque standard : core::range::Range, RangeFrom, RangeInclusive et les itérateurs associés. Contrairement aux anciens types de core::ops, les nouvelles plages ne réalisent pas Iterator directement, mais se convertissent en itérateur via IntoIterator. Grâce à cela, ces plages peuvent être Copy, ce qui est pratique, par exemple, lors de la conservation d'une plage comme champ d'une structure. La syntaxe comme 0..1 crée encore les anciens types de plages, mais dans une future révision du langage, il est prévu de la convertir aux nouveaux types.Ajout de assert_matches! et debug_assert_matches!.
Les nouvelles macros permettent de vérifier que la valeur correspond à un modèle donné. Logiquement, c'est similaire à assert!(matches!(…)), mais en cas d'erreur, la représentation Debug de la valeur est affichée, ce qui facilite le diagnostic. Les macros n'ont pas été ajoutées au préambule afin d'éviter des conflits avec des crates tierces populaires, il est donc nécessaire de les importer explicitement à partir de core ou std.Changement du comportement des cibles WebAssembly.
Rust ne passe plus au linker —allow-undefined pour les assemblages WebAssembly. Maintenant, les symboles indéfinis sont considérés comme une erreur lors de l'édition de liens, et ne se transforment plus automatiquement en imports du module "env". Cela devrait dévoiler plus tôt les erreurs de compilation et les noms de symboles incorrects. L'ancien comportement peut être rétabli si nécessaire en utilisant RUSTFLAGS=-Clink-arg=—allow-undefined ou en spécifiant explicitement le module wasm importé via #[link(wasm_import_module = "env")].Cargo a reçu des correctifs de sécurité.
Changements dans le langage.
Le release a inclus Plusieurs corrections ponctuelles et extensions : la transmission des méta-variables expr des macros est autorisée dans cfg, l'interprétation des types never dans les expressions tuple a été ajustée, des cas rares de suggestions de type incorrectes pour les arguments de fonction ont été corrigés, le support des registres vectoriels s390x a été ajouté dans l'assemblage inline, et l'utilisation de constantes de type ManuallyDrop comme modèles est à nouveau autorisée — cela corrige une régression apparue dans Rust 1.94.0.Modifications du compilateur et des plateformes.
Pour les cibles Linux sur LoongArch, le support de la relaxation de lien est inclus — une optimisation du lien qui facilite certaines transitions et appels après que le code ait été placé. Pour riscv64gc-unknown-fuchsia, la configuration de base a été mise à jour au profil RVA22 avec le support des extensions vectorielles.Mises à jour de la bibliothèque standard.
Ajout du support de l’itération sur les plages de nombres entiers NonZero. De plus, le traitement différé des adresses hôtes dans SGX via ToSocketAddr a été corrigé, et la documentation ainsi que les contrats internes précisent la définition de la mémoire « accessible en lecture/écriture » : le pointeur nul est exclu de la définition générale, et des exceptions sont spécifiées séparément pour des méthodes spécifiques.APIs stabilisées.
Parmi les interfaces stabilisées se trouvent assert_matches!, debug_assert_matches!, les implémentations de From pour AssertUnwindSafe, LazyCell et LazyLock, ainsi que de nouveaux types et itérateurs de plages de core::range, y compris Range, RangeFrom, RangeToInclusive et leurs itérateurs.Cargo : modifications pour les dépendances et la documentation.
Une dépendance peut maintenant indiquer à la fois un dépôt Git et un registre alternatif : la version Git sera utilisée localement, et lors de la publication, la version provenant du registre sera utilisée, de manière similaire au comportement avec crates.io. Le support de target.’cfg(..)’.rustdocflags a également été ajouté dans la configuration de Cargo.Rustdoc traite désormais la documentation de manière plus soignée.
Les notes sur l'API dépréciée sont maintenant rendues comme une documentation ordinaire, sans le précédent traitement spécial via white-space: pre-wrap. De plus, rustdoc n'émet plus de lint missing_doc_code_examples pour les éléments internes à impl, et dans la barre latérale de la documentation, les méthodes et fonctions associées sont séparées.Incompatibilités potentielles.
La version comporte plusieurs changements qui peuvent se manifester sur du code atypique : la mise en page de certains enum #[repr(Int)] a été corrigée dans des cas extrêmes, certaines conversions unsize inutiles en Pin sont interdites, les builds WebAssembly échouent maintenant en cas de symboles non définis, l'attribut aléatoirement stabilisé #![reexport_test_harness_main] est de nouveau fermé par un portail de fonctionnalité, le paramètre -Csoft-float a été supprimé, et la version minimale de LLVM externe a été augmentée à 21. Pour AVR, le type c_double a été changé en f32, car sur ces cibles C double est par défaut 32 bits.
Source : linux.org.ru
