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:
@@ -15,10 +15,8 @@ macro_rules! error {
|
||||
/// An error type used to represent an error that has already been reported by the compiler.
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
pub enum CompilerError<T> {
|
||||
/// Internal compiler error (I.e.: Compiler crashed).
|
||||
ICE,
|
||||
/// Compilation failed.
|
||||
CompilationFailed,
|
||||
/// Compilation failed, either due to normal errors or ICE.
|
||||
Failed,
|
||||
/// Compilation was interrupted.
|
||||
Interrupted(T),
|
||||
/// Compilation skipped. This happens when users invoke rustc to retrieve information such as
|
||||
@@ -54,8 +52,7 @@ where
|
||||
{
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
CompilerError::ICE => write!(f, "Internal Compiler Error"),
|
||||
CompilerError::CompilationFailed => write!(f, "Compilation Failed"),
|
||||
CompilerError::Failed => write!(f, "Compilation Failed"),
|
||||
CompilerError::Interrupted(reason) => write!(f, "Compilation Interrupted: {reason}"),
|
||||
CompilerError::Skipped => write!(f, "Compilation Skipped"),
|
||||
}
|
||||
@@ -68,8 +65,7 @@ where
|
||||
{
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
CompilerError::ICE => write!(f, "Internal Compiler Error"),
|
||||
CompilerError::CompilationFailed => write!(f, "Compilation Failed"),
|
||||
CompilerError::Failed => write!(f, "Compilation Failed"),
|
||||
CompilerError::Interrupted(reason) => write!(f, "Compilation Interrupted: {reason:?}"),
|
||||
CompilerError::Skipped => write!(f, "Compilation Skipped"),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user