tgoop.com/dereference_pointer_there/8576
Create:
Last Update:
Last Update:
#prog #rust #rustreleasenotes
Вышла версия Rust 1.81.0! Как всегда, котлеты детальные заметки о релизе отдельно, а мухи мои хайлайты отдельно.
▪️Компилятор теперь несколько иначе выводит лайфтаймы. Раньше при наличии self
компилятор выводил время жизни из ссылки на Self
, если оно было. Теперь компилятор ищет ссылку не непосредственно на Self
, а на тип, включающий в себя Self
, и прерывает компиляцию, если в типе self
больше одного лайфтайма. Примеры из PR:
// ранее компилировалось, а теперь нет
fn a(self: &Box<&Self>) -> &u32
fn b(self: &Pin<&mut Self>) -> &String
fn c(self: &mut &Self) -> Option<&Self>
fn d(self: &mut &Box<Self>, arg: &usize) -> &usize
// ранее не компилировалось, теперь компилируется
fn f(self: &Box<Self>) -> &u32
// компилируется, но теперь выбирает иной лайфтайм
fn e(self: &mut Box<Self>, arg: &usize) -> &usize
// ^ теперь ^ раньше
▪️Ещё насчёт лайфтаймов: компилятор теперь по умолчанию не компилирует код с ассоциированными константами с лайфтаймами в типах, если есть именованные лайфтаймы в текущей области видимости:
struct Foo<T>(T);
impl<'a> Foo<&'a ()> {
const STR: &str = "hello, world"; // низзя (но можно #[allow], если хочется)
}
impl Foo<()> {
const STR: &str = "hello, world"; // можно, других лт нет, выводится 'static
}
▪️Стабилизировали атрибут
#[expect]
, который заставляет компилятор выдавать предупреждение, если указанный линт не срабатывает. Пример:fn consume(_: i32) {
todo!()
}
pub fn foo() {
let mut x = 0; // warning: variable does not need to be mutable
consume(x);
}
pub fn bar() {
#[expect(unused_mut)]
let mut x = 0; // нет предупреждений
consume(x);
}
Эта вещь особенно полезна при написании чернового варианта кода. В отличие от
#[allow]
, компилятор будет выдавать предупреждение, когда весь код, вызывающий срабатывание указанного линта, будет исправлен.▪️Ещё изменение касательно атрибутов для линтов: если подобный линт вызывает предупреждение компилятора, то оно теперь непосредственно включает сообщение из
reason
:fn consume(_: i32) {}
#[deny(unused_mut, reason = "mutability is evil")]
pub fn f() {
let mut x = 0;
consume(x);
}
Вывод:
error: variable does not need to be mutable
--> src/lib.rs:5:9
|
5 | let mut x = 0;
| ----^
| |
| help: remove this `mut`
|
= note: mutability is evil
note: the lint level is defined here
--> src/lib.rs:3:8
|
3 | #[deny(unused_mut, reason = "mutability is evil")]
Строка
= note: mutability is evil
ранее отсутствовала в выводе.▪️У большинства вариантов ABI в Rust есть
*-unwind
варианты, которые позволяют паникам пересекать границу FFI. Для вариантов ABI без *-unwind
такое поведение является UB. В этой версии Rust программа теперь прекращает работу (abort), когда паника пересекает границу ABI, не поддерживающего раскрутку стека.▪️
offset_from
теперь можно всегда применять на указателях с одинаковыми адресами, вне зависимости от их происхождения (provenance). Да, в том числе на указателях из разных аллокаций. Сделано это для достижения provenance monotonicity: добавления произвольного provenance указателям не может добавить UB в программу, в которой UB не было.▪️
{Rc,Arc}::make_mut()
теперь работают на слайсах из клонируемых значений. Реализовано через отдельный нестабильный трейт, так что для своих типов реализовать не получится, увы.▪️До стейбла дошли улучшения сортировок. Да, теперь ваш говнокод в реализации
Ord
может вызвать панику.BY Блог*
Share with your friend now:
tgoop.com/dereference_pointer_there/8576