From: Argyrios Kyrtzidis Date: Mon, 24 Oct 2011 17:25:20 +0000 (+0000) Subject: [libclang] Make sure we don't try to erase past the StoredDiagnostics vector. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3e9d32656a8a3a787f64f9beeef66d2d700eb85d;p=clang [libclang] Make sure we don't try to erase past the StoredDiagnostics vector. Ted came upon the bug but I couldn't make a test out of it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142805 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 471476a444..970866469f 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -559,17 +559,26 @@ public: } // Retrieve the diagnostics associated with this AST - typedef const StoredDiagnostic *stored_diag_iterator; - stored_diag_iterator stored_diag_begin() const { + typedef StoredDiagnostic *stored_diag_iterator; + typedef const StoredDiagnostic *stored_diag_const_iterator; + stored_diag_const_iterator stored_diag_begin() const { return StoredDiagnostics.begin(); } - stored_diag_iterator stored_diag_end() const { + stored_diag_iterator stored_diag_begin() { + return StoredDiagnostics.begin(); + } + stored_diag_const_iterator stored_diag_end() const { + return StoredDiagnostics.end(); + } + stored_diag_iterator stored_diag_end() { return StoredDiagnostics.end(); } unsigned stored_diag_size() const { return StoredDiagnostics.size(); } - - SmallVector &getStoredDiagnostics() { - return StoredDiagnostics; + + stored_diag_iterator stored_diag_afterDriver_begin() { + if (NumStoredDiagnosticsFromDriver > StoredDiagnostics.size()) + NumStoredDiagnosticsFromDriver = 0; + return StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver; } typedef std::vector::iterator diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 032adf3876..c153435225 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -919,9 +919,7 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) { CleanTemporaryFiles(); if (!OverrideMainBuffer) { - StoredDiagnostics.erase( - StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver, - StoredDiagnostics.end()); + StoredDiagnostics.erase(stored_diag_afterDriver_begin(), stored_diag_end()); TopLevelDeclsInPreamble.clear(); } @@ -1002,6 +1000,7 @@ error: } StoredDiagnostics.clear(); + NumStoredDiagnosticsFromDriver = 0; return true; } @@ -1393,9 +1392,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( // Clear out old caches and data. getDiagnostics().Reset(); ProcessWarningOptions(getDiagnostics(), Clang->getDiagnosticOpts()); - StoredDiagnostics.erase( - StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver, - StoredDiagnostics.end()); + StoredDiagnostics.erase(stored_diag_afterDriver_begin(), stored_diag_end()); TopLevelDecls.clear(); TopLevelDeclsInPreamble.clear(); @@ -1438,11 +1435,8 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( // of preamble diagnostics. PreambleDiagnostics.clear(); PreambleDiagnostics.insert(PreambleDiagnostics.end(), - StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver, - StoredDiagnostics.end()); - StoredDiagnostics.erase( - StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver, - StoredDiagnostics.end()); + stored_diag_afterDriver_begin(), stored_diag_end()); + StoredDiagnostics.erase(stored_diag_afterDriver_begin(), stored_diag_end()); // Keep track of the preamble we precompiled. PreambleFile = FrontendOpts.OutputFile; @@ -2196,8 +2190,8 @@ void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column, // make that override happen and introduce the preamble. PreprocessorOpts.DisableStatCache = true; StoredDiagnostics.insert(StoredDiagnostics.end(), - this->StoredDiagnostics.begin(), - this->StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver); + stored_diag_begin(), + stored_diag_afterDriver_begin()); if (OverrideMainBuffer) { PreprocessorOpts.addRemappedFile(OriginalSourceFile, OverrideMainBuffer); PreprocessorOpts.PrecompiledPreambleBytes.first = Preamble.size();