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 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
- 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
ErrorGuaranteedwhen deciding whether to emit an error, or what kind of error to emit.
ErrorGuaranteedshould 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
ErrorGuaranteedunless we first emit an error or delayed bug ourselves.
Thankfully, in most cases, it should be statically impossible to abuse