[Modules] Early-exit if ReadOptionsBlock fails to avoid crashing

If we didn't tell ReadOptionsBlock to allow failures then we can't
assume that the stream is not in the middle of a block if it returns
out-of-date. This was causing a crash when we tried to continue reading.

Also, it's just generally a good idea to early-exit if we're doing
implicit module builds, since we will want to immediately rebuild this
module anyway and there's no reason to waste time continuing after
failure.

rdar://problem/24114938

llvm-svn: 260563
This commit is contained in:
Ben Langmuir 2016-02-11 18:54:02 +00:00
parent 74d7d2f00b
commit 9b1e442e67
2 changed files with 10 additions and 3 deletions
clang

View File

@ -2269,9 +2269,10 @@ ASTReader::ReadControlBlock(ModuleFile &F,
(AllowConfigurationMismatch && Result == ConfigurationMismatch))
Result = Success;
// If we've diagnosed a problem, we're done.
if (Result != Success &&
isDiagnosedResult(Result, ClientLoadCapabilities))
// If we can't load the module, exit early since we likely
// will rebuild the module anyway. The stream may be in the
// middle of a block.
if (Result != Success)
return Result;
} else if (Stream.SkipBlock()) {
Error("malformed block record in AST file");

View File

@ -0,0 +1,6 @@
// RUN: rm -rf %t
// Use -DA=0 so that there is at least one preprocessor option serialized after the diagnostic options.
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fimplicit-module-maps -I %S/Inputs %s -DA=0 -Rmodule-build -verify
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fimplicit-module-maps -I %S/Inputs %s -DA=0 -Werror -Rmodule-build -verify
@import category_top; // expected-remark {{building module}} expected-remark {{finished building}}