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
delay_span_bug
or other compiler error. Thus, you should not rely onErrorGuaranteed
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 ourselves.
Thankfully, in most cases, it should be statically impossible to abuse
ErrorGuaranteed
.