Ограничения
Следующие атрибуты влияют на ограничения времени компиляции.
Атрибут recursion_limit
Атрибут recursion_limit может применяться на уровне крейта для установки
максимальной глубины для потенциально бесконечно рекурсивных операций времени компиляции,
таких как раскрытие макросов или авто-разыменование.
Он использует синтаксис MetaNameValueStr для указания глубины рекурсии.
Note
Значение по умолчанию в
rustcравно 128.
#![allow(unused)] #![recursion_limit = "4"] fn main() { macro_rules! a { () => { a!(1); }; (1) => { a!(2); }; (2) => { a!(3); }; (3) => { a!(4); }; (4) => { }; } // Это не удаётся раскрыть, потому что требуется глубина рекурсии больше 4. a!{} }
#![allow(unused)] #![recursion_limit = "1"] fn main() { // Это не удаётся, потому что требуется два рекурсивных шага для авто-разыменования. (|_: &u8| {})(&&&1); }
Атрибут type_length_limit
Атрибут type_length_limit устанавливает максимальное количество подстановок типов, разрешённых при построении конкретного типа во время мономорфизации.
Note
rustcприменяет это ограничение только тогда, когда активен ночной флаг-Zenforce-type-length-limit.Для получения дополнительной информации см. Rust PR #127670.
Example
#![type_length_limit = "4"] fn f<T>(x: T) {} // Это не компилируется, потому что мономорфизация до // `f::<((((i32,), i32), i32), i32)>` требует более // 4 элементов типа. f(((((1,), 2), 3), 4));
Note
Значение по умолчанию в
rustcравно1048576.
Атрибут type_length_limit использует синтаксис MetaNameValueStr. Значение в строке должно быть неотрицательным числом.
Атрибут type_length_limit может применяться только к корню крейта.
Note
rustcигнорирует использование в других позициях, но выдает предупреждение. В будущем это может стать ошибкой.
Только первое использование type_length_limit на элементе имеет эффект.
Note
rustcвыдает предупреждение на любое использование после первого. В будущем это может стать ошибкой.