The bitstream reader handles errors poorly. This has two effects:
- Bugs in file handling (especially modules) manifest as an "unexpected end of file" crash
- Users of clang as a library end up aborting because the code unconditionally calls report_fatal_error
The bitstream reader should be more resilient and return Expected / Error as
soon as an error is encountered, not way late like it does now. This patch
starts doing so and adopting the error handling where I think it makes sense.
There's plenty more to do: this patch propagates errors to be minimally useful,
and follow-ups will propagate them further and improve diagnostics.
https://bugs.llvm.org/show_bug.cgi?id=42311
rdar://problem/33159405
This has caused problem for our sanitizer tests the last couple of days:
This was seen when building trunk with clang 6.0.0 and LVM_USE_SANITIZER=Undefined
Afaict we can't cast the read value to FixedAbbrevIDs as we do not know yet if it matches one of the values defined in the enum, or if we will take the default case.
A similar switch exist at cfe/trunk/lib/Frontend/SerializedDiagnosticReader.cpp:127, but it is using a slightly different pattern:
I haven't seen any failures for SerializedDiagnosticReader. So either we lack test coverage for that function, or the sanitizer only introduce the check when using the static_cast (and declaring Code as an enum) as done here.