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
|
@ -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"),
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue