From: Kadir Cetinkaya Date: Tue, 7 Apr 2020 18:08:55 +0000 (+0200) Subject: [clangd] Fix broken assertion X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=130dbf63ff12271be9451e259447c5fab768dce6;p=platform%2Fupstream%2Fllvm.git [clangd] Fix broken assertion Summary: This assertion was bad. It will show up once we start running preamble thread async. Think about the following case: - Update 1 builds a preamble, and an AST. Caches the AST. - Update 2 Invalidates the cache, preamble hasn't changed. - Update 3 Invalidates the cache, preamble hasn't changed - Read builds AST using preamble v1, and caches it. preamble for v2 gets build, cache isn't invalidated since preamble is same. generateDiags tries to reuse cached AST but latest version is 3 not 2, so assertion fails. Reviewers: sammccall Subscribers: ilya-biryukov, javed.absar, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D77664 --- diff --git a/clang-tools-extra/clangd/TUScheduler.cpp b/clang-tools-extra/clangd/TUScheduler.cpp index be4d52e..46ec8e9 100644 --- a/clang-tools-extra/clangd/TUScheduler.cpp +++ b/clang-tools-extra/clangd/TUScheduler.cpp @@ -795,7 +795,7 @@ void ASTWorker::generateDiagnostics( // FIXME: It might be better to not reuse this AST. That way queued AST builds // won't be required for diags. llvm::Optional> AST = IdleASTs.take(this); - if (!AST) { + if (!AST || !InputsAreLatest) { auto RebuildStartTime = DebouncePolicy::clock::now(); llvm::Optional NewAST = buildAST( FileName, std::move(Invocation), CIDiags, Inputs, LatestPreamble); @@ -817,8 +817,6 @@ void ASTWorker::generateDiagnostics( }); AST = NewAST ? std::make_unique(std::move(*NewAST)) : nullptr; } else { - assert(InputsAreLatest && !RanASTCallback && - "forgot to invalidate cached ast?"); log("Skipping rebuild of the AST for {0}, inputs are the same.", FileName); Status.update([](TUStatus &Status) { Status.Details.ReuseAST = true;