ErrorGuaranteed
앞 절에서는 컴파일러 사용자가 보게 되는 오류 메시지를 다루었습니다. 하지만 오류를 내보내는 일은 컴파일러 소스 코드 내부에서 두 번째로 중요한 부수 효과도 낳을 수 있습니다. 바로 ErrorGuaranteed를 생성한다는 것입니다.
ErrorGuaranteed는 rustc_errors 크레이트 밖에서는 생성할 수 없는 크기가 0인 타입입니다. 이 값은 사용자에게 오류가 보고될 때마다 생성되므로, 컴파일러 코드에서 ErrorGuaranteed 타입의 값을 마주친다면 해당 컴파일은 실패가 정적으로 보장됩니다. 오류 코드 경로가 실패로 이어진다는 것을 정적으로 검사할 수 있으므로, 이는 건전성(soundness)을 해치는 버그를 방지하는 데 유용합니다.
ErrorGuaranteed를 사용할 때 고려해야 할 몇 가지 중요한 사항은 다음과 같습니다.
- 이 타입은 오류의 종류에 관한 정보를 전달하지 않습니다. 예를 들어, 해당 오류는 지연된 버그나 다른 컴파일러 오류로 인해 (간접적으로) 발생한 것일 수 있습니다. 따라서 오류를 내보낼지 여부나 어떤 종류의 오류를 내보낼지 결정할 때
ErrorGuaranteed에 의존해서는 안 됩니다. ErrorGuaranteed는 컴파일이 앞으로 오류를 내보낼 것임을 나타내는 데 사용해서는 안 됩니다. 이 타입은 오류가 이미 내보내졌음을, 즉emit()함수가 이미 호출되었음을 나타내는 데 사용해야 합니다. 예를 들어, 컴파일러의 이후 단계에서 오류가 발생할 것임을 감지하더라도, 먼저 직접 오류나 지연된 버그를 내보내지 않는 한ErrorGuaranteed를 사용할 수 없습니다.
다행히 대부분의 경우 ErrorGuaranteed를 오용하는 것은 정적으로 불가능할 것입니다.