From: Sam McCall Date: Fri, 23 Jul 2021 12:26:45 +0000 (+0200) Subject: [clangd] Avoid range-loop init-list lifetime subtleties. X-Git-Tag: llvmorg-14-init~482 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=253b8145dedbe8d10792f44b4af7f52dbecd527f;p=platform%2Fupstream%2Fllvm.git [clangd] Avoid range-loop init-list lifetime subtleties. The original code appears to be OK per the spec, but we've had 3 reports of crashes with certain unofficial builds of clangd that look a lot like old compilers (GCC 5.4?) getting lifetime rules wrong. Fixes https://github.com/clangd/clangd/issues/800 Differential Revision: https://reviews.llvm.org/D106654 --- diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp index d830190..73f19ab 100644 --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp @@ -276,7 +276,7 @@ bool DirectoryBasedGlobalCompilationDatabase::DirectoryCache::load( // For these, we know the files they read and cache their metadata so we can // cheaply validate whether they've changed, and hot-reload if they have. // (As a bonus, these are also VFS-clean)! - struct CDBFile { + struct { CachedFile *File; // Wrapper for {Fixed,JSON}CompilationDatabase::loadFromBuffer. llvm::function_ref( @@ -284,10 +284,12 @@ bool DirectoryBasedGlobalCompilationDatabase::DirectoryCache::load( /*Data*/ llvm::StringRef, /*ErrorMsg*/ std::string &)> Parser; + } Files[] = { + {&CompileCommandsJson, parseJSON}, + {&BuildCompileCommandsJson, parseJSON}, + {&CompileFlagsTxt, parseFixed}, }; - for (const auto &Entry : {CDBFile{&CompileCommandsJson, parseJSON}, - CDBFile{&BuildCompileCommandsJson, parseJSON}, - CDBFile{&CompileFlagsTxt, parseFixed}}) { + for (const auto &Entry : Files) { bool Active = ActiveCachedFile == Entry.File; auto Loaded = Entry.File->load(FS, Active); switch (Loaded.Result) {