Вот пример ошибки с кодом:
fn main() {
let hi = foo;
}
error[E0425]: cannot find value `foo` in this scope
--> src/main.rs:2:14
|
2 | let hi = foo;
| ^^^ not found in this scope
For more information about this error, try `rustc --explain E0425`.
error: could not compile `hei` (bin "hei") due to 1 previous error
Однако эта программа выдаст ошибку без кода:
fn main() {
let 1_i32 << 32;
}
error: expected a pattern, found an expression
--> src/main.rs:2:5
|
2 | let 1_i32 << 32;
| ^^^^^^^^^^^ arbitrary expressions are not allowed in patterns
error: could not compile `hei` (bin "hei") due to 1 previous error
Если мы удалим ключевое слово let следующим образом, оно вернет другую ошибку из lint:
fn main() {
1_i32 << 32;
}
error: this arithmetic operation will overflow
--> src/main.rs:2:5
|
2 | 1_i32 << 32;
| ^^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
= note: `#[deny(arithmetic_overflow)]` on by default
Это из Rust 1.79.0.
Почему у некоторых ошибок есть код (и объяснение через rustc --explain), у некоторых — линты, а у некоторых… просто ошибки?
Я прочитал главы книги Rusc, посвященные ошибкам и ворсам. Я ожидал найти ответ, но не нашел ничего полезного.

Это вопрос о дизайне компилятора, поэтому я сверился с Руководство по разработке компилятора Rust и нашел это утверждение о «Коды ошибок и пояснения»:
Большинство ошибок имеют соответствующий код ошибки. Коды ошибок связаны с подробными пояснениями, которые содержат пример того, как вызвать ошибку, и подробные сведения об ошибке. Их можно просмотреть с помощью флага
--explainили через индекс ошибок.Как правило, ошибке присваивают код (с соответствующим объяснением), если объяснение дает больше информации, чем сама ошибка.
Таким образом, ошибки имеют коды ошибок, когда об ошибке есть что-то, что нельзя разумно поместить непосредственно в сообщение об ошибке.
Вы можете просмотреть индекс ошибок , чтобы увидеть, какие существуют объяснения. Часто они содержат простой пример кода и обсуждение того, почему этот код ошибочен. Вы можете себе представить, что было бы запутанно и многословно, если бы компилятор напечатал этот пример кода вместе с ошибкой в вашем коде!
Нет никакой документации о том, почему бы не использовать код ошибки, но я могу себе представить, что было бы дополнительной работой добавлять код для каждого отдельного случая, когда компилятор выдает ошибку, или решать, действительно ли ошибка одного и того же типа. как существующая ошибка. А это означало бы, что индекс ошибок станет очень большим, тем более что он охватывает не только все ошибки в текущей версии компилятора, но и во всех предыдущих версиях. (Коды ошибок перестают генерироваться, когда ошибки переклассифицируются в другие категории или становятся разрешенными, а не отклоненными из-за новых особенностей языка.)
Чтобы расширить ответ @KevinReid, я знаю, что у ошибок нет кода ошибки, это два случая: синтаксические ошибки и ворсы.
Синтаксические ошибки не имеют кода ошибки, потому что он бесполезен: он не может сказать больше, чем «ваш файл имеет неверный синтаксис Rust» (если мы не даем конкретный код каждой ошибке, что неработоспособно). Это ваш первый фрагмент (error: expected a pattern, found an expression).
Линты, как и ваш второй фрагмент (error: this arithmetic operation will overflow), могут содержать больше информации, но она находится в другом месте: https://doc.rust-lang.org/stable/rustc/lints/listing/index.html, сгруппировано по их тяжесть (deny, warn или allow). Их можно узнать по последней строке ошибки note: `#[deny/warn(lint_name)]` on by default.