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 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, the emit()
function has already been called. For example, if we detect that a future part of the compiler will error, we cannot use ErrorGuaranteed
unless we first emit an error ourselves.
Thankfully, in most cases, it should be statically impossible to abuse ErrorGuaranteed
.