Author: Duncan P. N. Exon Smith Date: 2019-11-11T16:36:02-08:00 New Revision: c46b3a2abd38d6fecd389c97dfa7df54af77fdb9
URL: https://github.com/llvm/llvm-project/commit/c46b3a2abd38d6fecd389c97dfa7df54af77fdb9 DIFF: https://github.com/llvm/llvm-project/commit/c46b3a2abd38d6fecd389c97dfa7df54af77fdb9.diff LOG: clang/Modules: Clean up modules on error in ReadAST ReadASTBlock and ReadASTExtensions can both return failures. Be consistent and remove all the just-loaded modules, just like when ReadASTCore returns failures. https://reviews.llvm.org/D70055 Added: Modified: clang/lib/Serialization/ASTReader.cpp Removed: ################################################################################ diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index b780335233b6..f7e3805fd04c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -4176,17 +4176,8 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, PreviousGeneration = incrementGeneration(*ContextObj); unsigned NumModules = ModuleMgr.size(); - SmallVector<ImportedModule, 4> Loaded; - switch (ASTReadResult ReadResult = - ReadASTCore(FileName, Type, ImportLoc, - /*ImportedBy=*/nullptr, Loaded, 0, 0, - ASTFileSignature(), ClientLoadCapabilities)) { - case Failure: - case Missing: - case OutOfDate: - case VersionMismatch: - case ConfigurationMismatch: - case HadErrors: { + auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { + assert(ReadResult && "expected to return error"); ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, PP.getLangOpts().Modules ? &PP.getHeaderSearchInfo().getModuleMap() @@ -4197,7 +4188,20 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, GlobalIndex.reset(); ModuleMgr.setGlobalIndex(nullptr); return ReadResult; - } + }; + + SmallVector<ImportedModule, 4> Loaded; + switch (ASTReadResult ReadResult = + ReadASTCore(FileName, Type, ImportLoc, + /*ImportedBy=*/nullptr, Loaded, 0, 0, + ASTFileSignature(), ClientLoadCapabilities)) { + case Failure: + case Missing: + case OutOfDate: + case VersionMismatch: + case ConfigurationMismatch: + case HadErrors: + return removeModulesAndReturn(ReadResult); case Success: break; } @@ -4211,12 +4215,12 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, // Read the AST block. if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) - return Result; + return removeModulesAndReturn(Result); // Read the extension blocks. while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { if (ASTReadResult Result = ReadExtensionBlock(F)) - return Result; + return removeModulesAndReturn(Result); } // Once read, set the ModuleFile bit base offset and update the size in _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits