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.