ErrorGuaranteed
The previous sections have been about the error message that a user of the
compiler sees. But emitting an error can also have a second important side
effect within the compiler source code: it generates an
ErrorGuaranteed
.
ErrorGuaranteed
is a zero-sized type that is unconstructable outside of the
rustc_errors
crate. It is generated whenever an error is reported
to the user, so that if your compiler code ever encounters a value of type
ErrorGuaranteed
, the compilation is statically guaranteed to fail. This is
useful for avoiding unsoundness bugs because you can statically check that an
error code path leads to a failure.
There are some important considerations about the usage of ErrorGuaranteed
:
- It does not convey information about the kind of error. For example, the
error may be due (indirectly) to a delayed bug or other compiler error.
Thus, you should not rely on
ErrorGuaranteed
when deciding whether to emit an error, or what kind of error to emit. ErrorGuaranteed
should not be used to indicate that a compilation will emit an error in the future. It should be used to indicate that an error has already been emitted -- that is, theemit()
function has already been called. For example, if we detect that a future part of the compiler will error, we cannot useErrorGuaranteed
unless we first emit an error or delayed bug ourselves.
Thankfully, in most cases, it should be statically impossible to abuse
ErrorGuaranteed
.