Merge CompilerError::CompilationFailed
and CompilerError::ICE
.
`CompilerError` has `CompilationFailed` and `ICE` variants, which seems reasonable at first. But the way it identifies them is flawed: - If compilation errors out, i.e. `RunCompiler::run` returns an `Err`, it uses `CompilationFailed`, which is reasonable. - If compilation panics with `FatalError`, it catches the panic and uses `ICE`. This is sometimes right, because ICEs do cause `FatalError` panics, but sometimes wrong, because certain compiler errors also cause `FatalError` panics. (The compiler/rustdoc/clippy/whatever just catches the `FatalError` with `catch_with_exit_code` in `main`.) In other words, certain non-ICE compilation failures get miscategorized as ICEs. It's not possible to reliably distinguish the two cases, so this commit merges them. It also renames the combined variant as just `Failed`, to better match the existing `Interrupted` and `Skipped` variants. Here is an example of a non-ICE failure that causes a `FatalError` panic, from `tests/ui/recursion_limit/issue-105700.rs`: ``` #![recursion_limit="4"] #![invalid_attribute] #![invalid_attribute] #![invalid_attribute] #![invalid_attribute] #![invalid_attribute] //~^ERROR recursion limit reached while expanding fn main() {{}} ```
This commit is contained in:
parent
cefa14bf2f
commit
e72e7e9ae3
3 changed files with 13 additions and 11 deletions
|
@ -347,8 +347,14 @@ macro_rules! run_driver {
|
|||
Err(CompilerError::Interrupted(value))
|
||||
}
|
||||
(Ok(Ok(_)), None) => Err(CompilerError::Skipped),
|
||||
(Ok(Err(_)), _) => Err(CompilerError::CompilationFailed),
|
||||
(Err(_), _) => Err(CompilerError::ICE),
|
||||
// Two cases here:
|
||||
// - `run` finished normally and returned `Err`
|
||||
// - `run` panicked with `FatalErr`
|
||||
// You might think that normal compile errors cause the former, and
|
||||
// ICEs cause the latter. But some normal compiler errors also cause
|
||||
// the latter. So we can't meaningfully distinguish them, and group
|
||||
// them together.
|
||||
(Ok(Err(_)), _) | (Err(_), _) => Err(CompilerError::Failed),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue