Voydevich
Rust

Що нового в Rust 1.99

Стабілізація C-variadic функцій, нові API для роботи з пам'яттю та файловою системою, а також профіль debug у Cargo.

Реліз від 16 жовтня 2026 · оновлено 8 листопада 2026

Головне

  • Стабілізовано визначення C-variadic функцій та c_variadic_naked_functions
  • Додано методи Vec::into_parts, Vec::from_parts та std::fs::set_times
  • У Cargo з'явився вбудований профіль debug
  • no_mangle_generic_items переведено у категорію жорстких помилок
  • Ціль riscv64-unknown-linux-musl переведено на Tier 2 із хост-інструментами

Коротко

У релізі Rust 1.99 стабілізовано визначення функцій зі змінною кількістю аргументів у стилі C (C-variadic), включно з можливістю використання #[unsafe(naked)]. Стандартна бібліотека отримала низку нових API, серед яких Vec::into_parts, Vec::from_parts, методи для роботи з сирими вказівниками та встановлення часу файлів. У Cargo додано новий вбудований профіль debug, а також вимкнено інкрементальну компіляцію в CI за замовчуванням.

Нові можливості

Мова програмування

  • C-variadic функції: стабілізовано визначення C-variadic функцій, а також можливість оголошувати їх за допомогою #[unsafe(naked)] (#![feature(c_variadic_naked_functions)]).
  • Синтаксис модулів у макросах: стабілізовано запис виду #[my_macro] mod foo;, що дозволяє використовувати винесені модулі (mod foo;) у тілі атрибутних та derive-макросів.
  • Вбудований асемблер x86: стабілізовано передачу 128-бітних цілих чисел через векторні регістри в asm!.
  • Доступ до UnsafeCell: тепер офіційно гарантується, що доступ до вмісту UnsafeCell може здійснюватися без виклику get.
  • Приведення типів: додано коерцію від змінних виведення типів до trait objects, якщо змінна виведення пов'язана через підтипування з типом, для якого відомо, що він Sized.
  • Перевизначення методів трейтів: методи трейтів тепер резолвляться на скоригованому never type.

Компілятор і діагностика

  • Підказки на основі doc alias: у пропозиціях щодо пропущеного методу rustc тепер віддає перевагу точному збігу з атрибута doc alias перед пошуком за схожістю серед інших назв методів.
  • Нові лінти:
    • raw_borrows_via_references (allow за замовчуванням) — перевіряє посилання, які одразу перетворюються на raw borrows.
    • unreachable_cfg_select_predicates увімкнено у складі групи unused.
    • unused_footnote_definition — новий лінт у rustdoc.
    • semicolon_in_expressions_from_non_local_macros — попередження про макроси з інших крейтів, які розгортаються у крапку з комою.
  • Розширення лінтів: unconditional_panic розширено на виклики функцій, які панікують при нульовому розмірі chunks/windows; додано POSIX-символи до invalid_runtime_symbol_definitions та suspicious_runtime_symbol_definitions.
  • Цільові платформи:
    • riscv64-unknown-linux-musl підвищено до Tier 2 з підтримкою хост-інструментів.
    • Увімкнено static_position_independent_executables для всіх цілей gnu.
    • Опцію -Ctarget-cpu перетворено на target-modifier для AVR, AMDGCN та NVPTX.

Стабілізовані API

  • IntoIterator для Box<[T; N]>, &Box<[T; N]> та &mut Box<[T; N]>
  • VecDeque::retain_back
  • core::ffi::VaList
  • Box::into_non_null та Box::from_non_null
  • Vec::into_parts та Vec::from_parts
  • core::mem::size_of_val_raw та core::mem::align_of_val_raw
  • core::alloc::Layout::for_value_raw
  • String::from_utf8_lossy_owned та string::FromUtf8Error::into_utf8_lossy
  • FusedIterator for StepBy<I>
  • std::fs::set_times та std::fs::set_times_nofollow
  • <LocalKey<Cell<T>>>::update

Cargo

  • Профіль debug: додано новий вбудований профіль debug для підготовки до відокремлення профілю dev від налагодження. Наразі між dev та debug немає різниці.
  • Управління залежностями воркспейсу: учасники воркспейсу на редакції 2024 або новішій можуть перевизначати поле default-features для успадкованих залежностей (наприклад, serde = { workspace = true, default-features = false }).

Інші покращення бібліотек та інструментів

  • Функцію transmute_copy послаблено для підтримки ?Sized типів, а також переведено на використання паніки без розгортання стека (non-unwinding).
  • У rustdoc покращено фільтрацію реалізацій трейтів, що прискорює роботу в середньому на 20% (і до 40% на окремих крейтах).

Ламаючі зміни

  • no_mangle_generic_items переведено у статус жорсткої помилки компілятора.
  • Атрибути, які ні до чого не застосовуються всередині блоків коду в doc-коментарях, тепер викликають помилку.
  • Зупиняється обчислення констант (const-eval), якщо в типі створюваного значення присутні дженерики.
  • Застарілі модулі цілих чисел (наприклад, std::i32) остаточно оголошено застарілими; доступ до констант слід здійснювати безпосередньо через тип (наприклад, i32::MAX).
  • У Cargo інкрементальна компіляція тепер вимкнена за замовчуванням під час запуску в CI (наявність середовища визначається за змінною CI).

Виправлення та покращення

  • Виправлено неправильну компіляцію повернення значень bool через FFI на архітектурі x86_64 (версія 1.99.1).
  • Виправлено відсутній символ wcslen для цілей UEFI та embedded (версія 1.99.1).
  • Додано rpath для libLLVM у rust-lld на macOS (версія 1.99.1).
  • PowerPC inline ASM: виправлено потрапляння скалярних чисел із рухомою комою у неправильний vector lane на little endian.
  • Виправлено поведінку overflowing_literals при повторному запереченні (наприклад, для --128_i8).
  • Виправлено помилку, через яку атрибут #[repr(simd)] помилково дозволявся на викликах макросів у стабільному Rust.
  • Гарантовано проходження перевірки типів для виведених типів у let-патернах.
  • hermit/fs: повертається unsupported() замість from_raw_os_error(22).
  • Оновлено внутрішню версію LLVM до 23.

Огляд підготовлено автоматично за офіційними release notes за допомогою ШІ та перевірено на відповідність джерелу. Точні формулювання дивіться в оригіналі. Як ми працюємо