[PATCH] D146156: [clang][Lexer] Fix crash/assert clang::HeaderSearch::search_dir_nth

Dmitry Polukhin via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 15 10:53:18 PDT 2023


DmitryPolukhin created this revision.
DmitryPolukhin added reviewers: bruno, troyj, arphaman, vsapsai, jansvoboda11.
DmitryPolukhin added a project: clang.
Herald added a subscriber: kadircet.
Herald added a project: All.
DmitryPolukhin requested review of this revision.
Herald added a subscriber: ilya-biryukov.

The issue was intrduced in D135801 <https://reviews.llvm.org/D135801>. When there is no header map in the
SearchDirs, out out of bounds values assigned to FirstNonHeaderMapSearchDirIdx.

Reproduced crash on clangd:
V[10:30:24.298] Building first preamble for <stripped> version 1
I[10:31:26.018] Indexing c++20 standard library in the context of <stripped>
clangd: llvm-project/clang/include/clang/Lex/HeaderSearch.h:817: ConstSearchDirIterator clang::HeaderSearch::search_dir_nth(size_t) const: Assertion `n < SearchDirs.size()' failed.
`bt
(lldb) bt

- thread #1, name = 'clangd.main', stop reason = hit program assert
  - frame #0: 0x00007ffff584eacf libc.so.6`raise + 271 frame #1: 0x00007ffff5821ea5 libc.so.6`abort + 295 frame #2: 0x00007ffff5821d79 libc.so.6`__assert_fail_base.cold.0 + 15 frame #3: 0x00007ffff5847426 libc.so.6`__assert_fail + 70 frame #4: 0x00005555597ec12d clangd`clang::HeaderSearch::search_dir_nth(this=0x00005555679d1500, n=1) const at HeaderSearch.h:817:5 frame #5: 0x00005555597e47c2 clangd`clang::HeaderSearch::LookupFile(this=0x00005555679d1500, Filename=(Data = "vector>)\n#error Mandatory header <vector> not found in standard library!\n#endif\n#if __has_include(<codecvt>)\n#include <codecvt>\n#endif\n#if __has_include(<cwchar>)\n#include <cwchar>\n#endif\n#if __has_include(<cuchar>)\n#include <cuchar>\n#endif\n#if __has_include(<cstddef>)\n#include <cstddef>\n#endif\n#if __has_include(<cstdlib>)\n#include <cstdlib>\n#endif\n#if __has_include(<cstring>)\n#include <cstring>\n#endif\n#if __has_include(<ctime>)\n#include <ctime>\n#endif\n#if __has_include(<cstdio>)\n#include <cstdio>\n#endif\n#if __has_include(<stddef.h>)\n#include <stddef.h>\n#endif\n#if __has_include(<stdlib.h>)\n#include <stdlib.h>\n#endif\n#if __has_include(<string.h>)\n#include <string.h>\n#endif\n#if __has_include(<wchar.h>)\n#include <wchar.h>\n#endif\n#if __has_include(<uchar.h>)\n#include <uchar.h>\n#endif\n#if __has_include(<time.h>)\n#include <time.h>\n#endif\n#if __has_include(<stdio.h>)\n#include <stdio.h>\n#endif\n#if __has_include(<type_traits>)\n#include <type_traits>\n#endif\n#if __has_include(<functional>)\n#include <functional>\n#endif\n#"..., Length = 6), IncludeLoc=(ID = 21), isAngled=true, FromDir=clang::ConstSearchDirIterator @ 0x00007fffffff4490, CurDirArg=0x00007fffffff4968, Includers=ArrayRef<std::pair<const clang::FileEntry *, const clang::DirectoryEntry *> > @ 0x00007fffffff44a0, SearchPath=0x0000000000000000, RelativePath=0x0000000000000000, RequestingModule=0x0000000000000000, SuggestedModule=0x0000000000000000, IsMapped=0x0000000000000000, IsFrameworkFound=0x0000000000000000, SkipCache=false, BuildSystemModule=false, OpenFile=true, CacheFailures=true) at HeaderSearch.cpp:1031:16 frame #6: 0x000055555979490c clangd`clang::Preprocessor::LookupFile(this=0x0000555567d44f00, FilenameLoc=(ID = 21), Filename=(Data = "vector>)\n#error Mandatory header <vector> not found in standard library!\n#endif\n#if __has_include(<codecvt>)\n#include <codecvt>\n#endif\n#if __has_include(<cwchar>)\n#include <cwchar>\n#endif\n#if __has_include(<cuchar>)\n#include <cuchar>\n#endif\n#if __has_include(<cstddef>)\n#include <cstddef>\n#endif\n#if __has_include(<cstdlib>)\n#include <cstdlib>\n#endif\n#if __has_include(<cstring>)\n#include <cstring>\n#endif\n#if __has_include(<ctime>)\n#include <ctime>\n#endif\n#if __has_include(<cstdio>)\n#include <cstdio>\n#endif\n#if __has_include(<stddef.h>)\n#include <stddef.h>\n#endif\n#if __has_include(<stdlib.h>)\n#include <stdlib.h>\n#endif\n#if __has_include(<string.h>)\n#include <string.h>\n#endif\n#if __has_include(<wchar.h>)\n#include <wchar.h>\n#endif\n#if __has_include(<uchar.h>)\n#include <uchar.h>\n#endif\n#if __has_include(<time.h>)\n#include <time.h>\n#endif\n#if __has_include(<stdio.h>)\n#include <stdio.h>\n#endif\n#if __has_include(<type_traits>)\n#include <type_traits>\n#endif\n#if __has_include(<functional>)\n#include <functional>\n#endif\n#"..., Length = 6), isAngled=true, FromDir=clang::ConstSearchDirIterator @ 0x00007fffffff49f0, FromFile=0x0000000000000000, CurDirArg=0x0000000000000000, SearchPath=0x0000000000000000, RelativePath=0x0000000000000000, SuggestedModule=0x0000000000000000, IsMapped=0x0000000000000000, IsFrameworkFound=0x0000000000000000, SkipCache=false, OpenFile=true, CacheFailures=true) at PPDirectives.cpp:1014:40 frame #7: 0x0000555559812355 clangd`EvaluateHasIncludeCommon(Tok=0x00007fffffff6830, II=0x000055556721c008, PP=0x0000555567d44f00, LookupFrom=clang::ConstSearchDirIterator @ 0x00007fffffff4c98, LookupFromFile=0x0000000000000000) at PPMacroExpansion.cpp:1253:10 frame #8: 0x0000555559811e17 clangd`clang::Preprocessor::EvaluateHasInclude(this=0x0000555567d44f00, Tok=0x00007fffffff6830, II=0x000055556721c008) at PPMacroExpansion.cpp:1269:10 frame #9: 0x000055555980f85d clangd`clang::Preprocessor::ExpandBuiltinMacro(this=0x0000555567d44f00, Tok=0x00007fffffff6830) at PPMacroExpansion.cpp:1802:15 frame #10: 0x000055555980ddca clangd`clang::Preprocessor::HandleMacroExpandedIdentifier(this=0x0000555567d44f00, Identifier=0x00007fffffff6830, M=0x00007fffffff5c50) at PPMacroExpansion.cpp:493:5 frame #11: 0x000055555983ba8b clangd`clang::Preprocessor::HandleIdentifier(this=0x0000555567d44f00, Identifier=0x00007fffffff6830) at Preprocessor.cpp:825:18 frame #12: 0x00005555597765f5 clangd`clang::Lexer::LexIdentifierContinue(this=0x0000555567d3a410, Result=0x00007fffffff6830, CurPtr="(<vector>)\n#error Mandatory header <vector> not found in standard library!\n#endif\n#if __has_include(<codecvt>)\n#include <codecvt>\n#endif\n#if __has_include(<cwchar>)\n#include <cwchar>\n#endif\n#if __has_include(<cuchar>)\n#include <cuchar>\n#endif\n#if __has_include(<cstddef>)\n#include <cstddef>\n#endif\n#if __has_include(<cstdlib>)\n#include <cstdlib>\n#endif\n#if __has_include(<cstring>)\n#include <cstring>\n#endif\n#if __has_include(<ctime>)\n#include <ctime>\n#endif\n#if __has_include(<cstdio>)\n#include <cstdio>\n#endif\n#if __has_include(<stddef.h>)\n#include <stddef.h>\n#endif\n#if __has_include(<stdlib.h>)\n#include <stdlib.h>\n#endif\n#if __has_include(<string.h>)\n#include <string.h>\n#endif\n#if __has_include(<wchar.h>)\n#include <wchar.h>\n#endif\n#if __has_include(<uchar.h>)\n#include <uchar.h>\n#endif\n#if __has_include(<time.h>)\n#include <time.h>\n#endif\n#if __has_include(<stdio.h>)\n#include <stdio.h>\n#endif\n#if __has_include(<type_traits>)\n#include <type_traits>\n#endif\n#if __has_include(<functional>)\n#include <functional>\n#endif"...) at Lexer.cpp:1900:16 frame #13: 0x000055555977cb2c clangd`clang::Lexer::LexTokenInternal(this=0x0000555567d3a410, Result=0x00007fffffff6830, TokAtPhysicalStartOfLine=false) at Lexer.cpp:3873:12 frame #14: 0x0000555559779dec clangd`clang::Lexer::Lex(this=0x0000555567d3a410, Result=0x00007fffffff6830) at Lexer.cpp:3576:24 frame #15: 0x000055555983bdef clangd`clang::Preprocessor::Lex(this=0x0000555567d44f00, Result=0x00007fffffff6830) at Preprocessor.cpp:886:33 frame #16: 0x00005555597fe055 clangd`clang::Preprocessor::LexNonComment(this=0x0000555567d44f00, Result=0x00007fffffff6830) at Preprocessor.h:1758:7 frame #17: 0x00005555597fba74 clangd`EvaluateValue(Result=0x00007fffffff6808, PeekTok=0x00007fffffff6830, DT=0x00007fffffff67f0, ValueLive=true, PP=0x0000555567d44f00) at PPExpressions.cpp:513:8 frame #18: 0x00005555597fa338 clangd`clang::Preprocessor::EvaluateDirectiveExpression(this=0x0000555567d44f00, IfNDefMacro=0x00007fffffff6938) at PPExpressions.cpp:892:7 frame #19: 0x0000555559797018 clangd`clang::Preprocessor::HandleIfDirective(this=0x0000555567d44f00, IfToken=0x0000555568032160, HashToken=0x00007fffffff6b50, ReadAnyTokensBeforeDirective=false) at PPDirectives.cpp:3303:35 frame #20: 0x00005555597963d2 clangd`clang::Preprocessor::HandleDirective(this=0x0000555567d44f00, Result=0x0000555568032160) at PPDirectives.cpp:1204:14 frame #21: 0x000055555977e424 clangd`clang::Lexer::LexTokenInternal(this=0x0000555567d3a410, Result=0x0000555568032160, TokAtPhysicalStartOfLine=true) at Lexer.cpp:4362:7 frame #22: 0x0000555559779dec clangd`clang::Lexer::Lex(this=0x0000555567d3a410, Result=0x0000555568032160) at Lexer.cpp:3576:24 frame #23: 0x000055555983bdef clangd`clang::Preprocessor::Lex(this=0x0000555567d44f00, Result=0x0000555568032160) at Preprocessor.cpp:886:33 frame #24: 0x000055555da8574e clangd`clang::Parser::ConsumeToken(this=0x0000555568032150) at Parser.h:503:8 frame #25: 0x000055555da7c724 clangd`clang::Parser::Initialize(this=0x0000555568032150) at Parser.cpp:567:3 frame #26: 0x000055555da78175 clangd`clang::ParseAST(S=0x0000555567c6e920, PrintStats=false, SkipFunctionBodies=true) at ParseAST.cpp:155:7 frame #27: 0x000055555adcd686 clangd`clang::ASTFrontendAction::ExecuteAction(this=0x000055556068c7e0) at FrontendAction.cpp:1168:3 frame #28: 0x000055555adcd0ac clangd`clang::FrontendAction::Execute(this=0x000055556068c7e0) at FrontendAction.cpp:1058:8 frame #29: 0x000055555ba4b5c3 clangd`clang::clangd::indexStandardLibrary(HeaderSources=(Data = "#if !__has_include(<vector>)\n#error Mandatory header <vector> not found in standard library!\n#endif\n#if __has_include(<codecvt>)\n#include <codecvt>\n#endif\n#if __has_include(<cwchar>)\n#include <cwchar>\n#endif\n#if __has_include(<cuchar>)\n#include <cuchar>\n#endif\n#if __has_include(<cstddef>)\n#include <cstddef>\n#endif\n#if __has_include(<cstdlib>)\n#include <cstdlib>\n#endif\n#if __has_include(<cstring>)\n#include <cstring>\n#endif\n#if __has_include(<ctime>)\n#include <ctime>\n#endif\n#if __has_include(<cstdio>)\n#include <cstdio>\n#endif\n#if __has_include(<stddef.h>)\n#include <stddef.h>\n#endif\n#if __has_include(<stdlib.h>)\n#include <stdlib.h>\n#endif\n#if __has_include(<string.h>)\n#include <string.h>\n#endif\n#if __has_include(<wchar.h>)\n#include <wchar.h>\n#endif\n#if __has_include(<uchar.h>)\n#include <uchar.h>\n#endif\n#if __has_include(<time.h>)\n#include <time.h>\n#endif\n#if __has_include(<stdio.h>)\n#include <stdio.h>\n#endif\n#if __has_include(<type_traits>)\n#include <type_traits>\n#endif\n#if __has_include(<functional>)\n#include <"..., Length = 6974), CI=nullptr, Loc=0x00007fffffff8398, TFS=0x00007fffffffe478) at StdLib.cpp:248:33 frame #30: 0x000055555ba4c181 clangd`clang::clangd::indexStandardLibrary(Invocation=nullptr, Loc=0x00007fffffff8398, TFS=0x00007fffffffe478) at StdLib.cpp:271:10 frame #31: 0x000055555b14303b clangd`clang::clangd::(anonymous namespace)::UpdateIndexCallbacks::indexStdlib(this=0x00007fffffff8098)::'lambda'()::operator()() at ClangdServer.cpp:94:20 frame #32: 0x000055555b142e61 clangd`clang::clangd::(anonymous namespace)::UpdateIndexCallbacks::indexStdlib(this=0x000055555f44ccc0, CI=0x000055555f455490, Loc=StdLibLocation @ 0x00007fffffff8468) at ClangdServer.cpp:102:7 frame #33: 0x000055555b1429b2 clangd`clang::clangd::(anonymous namespace)::UpdateIndexCallbacks::onPreambleAST(this=0x000055555f44ccc0, Path=(Data = "<stripped>", Length = 71), Version=(Data = "1", Length = 1), CI=0x000055555f455490, Ctx=0x000055555f573190, PP=0x000055555f4834a0, CanonIncludes=0x00007fffffff9350) at ClangdServer.cpp:75:9 frame #34: 0x000055555b68a74b clangd`clang::clangd::(anonymous namespace)::PreambleThread::build(clang::clangd::(anonymous namespace)::PreambleThread::Request)::$_0::operator()(this=0x000055555f4b2910, Ctx=0x000055555f573190, PP=0x000055555f4834a0, CanonIncludes=0x00007fffffff9350) const at TUScheduler.cpp:1088:19 frame #35: 0x000055555b68a69d clangd`void std::__invoke_impl<void, clang::clangd::(anonymous namespace)::PreambleThread::build(clang::clangd::(anonymous namespace)::PreambleThread::Request)::$_0&, clang::ASTContext&, clang::Preprocessor&, clang::clangd::CanonicalIncludes const&>((null)=__invoke_other @ 0x00007fffffff85b8, __f=0x000055555f4b2910, __args=0x000055555f573190, __args=0x000055555f4834a0, __args=0x00007fffffff9350) at invoke.h:61:14 frame #36: 0x000055555b68a63d clangd`std::enable_if<is_invocable_r_v<void, clang::clangd::(anonymous namespace)::PreambleThread::build(clang::clangd::(anonymous namespace)::PreambleThread::Request)::$_0&, clang::ASTContext&, clang::Preprocessor&, clang::clangd::CanonicalIncludes const&>, void>::type std::__invoke_r<void, clang::clangd::(anonymous namespace)::PreambleThread::build(clang::clangd::(anonymous namespace)::PreambleThread::Request)::$_0&, clang::ASTContext&, clang::Preprocessor&, clang::clangd::CanonicalIncludes const&>(__fn=0x000055555f4b2910, __args=0x000055555f573190, __args=0x000055555f4834a0, __args=0x00007fffffff9350) at invoke.h:111:2 frame #37: 0x000055555b68a525 clangd`std::_Function_handler<void (clang::ASTContext&, clang::Preprocessor&, clang::clangd::CanonicalIncludes const&), clang::clangd::(anonymous namespace)::PreambleThread::build(clang::clangd::(anonymous namespace)::PreambleThread::Request)::$_0>::_M_invoke(__functor=0x00007fffffff9280, __args=0x000055555f573190, __args=0x000055555f4834a0, __args=0x00007fffffff9350) at std_function.h:290:9 frame #38: 0x000055555b4a19bd clangd`std::function<void (clang::ASTContext&, clang::Preprocessor&, clang::clangd::CanonicalIncludes const&)>::operator()(this=0x00007fffffff9280, __args=0x000055555f573190, __args=0x000055555f4834a0, __args=0x00007fffffff9350) const at std_function.h:591:9 frame #39: 0x000055555b49a0f6 clangd`clang::clangd::(anonymous namespace)::CppFilePreambleCallbacks::AfterExecute(this=0x00007fffffff9268, CI=0x000055555f4bf9f0) at Preamble.cpp:97:7 frame #40: 0x000055555ae012c5 clangd`clang::PrecompiledPreamble::Build(Invocation=0x00007fffffff9d10, MainFileBuffer=0x000055555f4b0a30, Bounds=(Size = 133, PreambleEndsAtStartOfLine = true), Diagnostics=0x000055555f4b0ac0, VFS=IntrusiveRefCntPtr<llvm::vfs::FileSystem> @ 0x00007fffffff90f8, PCHContainerOps=nullptr, StoreInMemory=false, StoragePath=(Data = 0x0000000000000000, Length = 0), Callbacks=0x00007fffffff9268) at PrecompiledPreamble.cpp:539:13 frame #41: 0x000055555b4973a8 clangd`clang::clangd::buildPreamble(FileName=(Data = "<stripped>", Length = 71), CI=CompilerInvocation @ 0x00007fffffff9d10, Inputs=0x00007fffffffab78, StoreInMemory=false, PreambleCallback=clang::clangd::PreambleParsedCallback @ 0x00007fffffff9cf0, Stats=0x00007fffffffaa10) at Preamble.cpp:644:24 frame #42: 0x000055555b689692 clangd`clang::clangd::(anonymous namespace)::PreambleThread::build(this=0x000055555f4b99b8, Req=Request @ 0x00007fffffffab70) at TUScheduler.cpp:1084:17 frame #43: 0x000055555b68ee91 clangd`clang::clangd::(anonymous namespace)::PreambleThread::update(this=0x000055555f4b99b8, CI=<unavailable>, PI=ParseInputs @ 0x00007fffffffb000, CIDiags=size=0, WantDiags=Yes) at TUScheduler.cpp:444:7 frame #44: 0x000055555b68ec14 clangd`clang::clangd::(anonymous namespace)::ASTWorker::update(clang::clangd::ParseInputs, clang::clangd::WantDiagnostics, bool)::$_7::operator()(this=0x000055555f44d260) at TUScheduler.cpp:944:18 frame #45: 0x000055555b68e48d clangd`void llvm::detail::UniqueFunctionBase<void>::CallImpl<clang::clangd::(anonymous namespace)::ASTWorker::update(clang::clangd::ParseInputs, clang::clangd::WantDiagnostics, bool)::$_7>(CallableAddr=0x000055555f44d260) at FunctionExtras.h:221:12 frame #46: 0x000055555b1a15bf clangd`llvm::unique_function<void ()>::operator()(this=0x00007fffffffc3f0) at FunctionExtras.h:383:12 frame #47: 0x000055555b694435 clangd`void llvm::function_ref<void ()>::callback_fn<llvm::unique_function<void ()>>(callable=140737488339952) at STLFunctionalExtras.h:45:12 frame #48: 0x0000555558aba659 clangd`llvm::function_ref<void ()>::operator()(this=0x00007fffffffbcb0) const at STLFunctionalExtras.h:68:12 frame #49: 0x000055555b685f34 clangd`clang::clangd::(anonymous namespace)::ASTWorker::runTask(this=0x000055555f4b9510, Name=(Data = "Update", Length = 6), Task=function_ref<void ()> @ 0x00007fffffffbcb0) at TUScheduler.cpp:1328:3 frame #50: 0x000055555b68d6c1 clangd`clang::clangd::(anonymous namespace)::ASTWorker::startTask(this=0x000055555f4b9510, Name=(Data = "Update", Length = 6), Task=unique_function<void ()> @ 0x00007fffffffc3f0, Update= Has Value=true , Invalidation=NoInvalidation) at TUScheduler.cpp:1337:5 frame #51: 0x000055555b6804f3 clangd`clang::clangd::(anonymous namespace)::ASTWorker::update(this=0x000055555f4b9510, Inputs=ParseInputs @ 0x00007fffffffc610, WantDiags=Yes, ContentChanged=true) at TUScheduler.cpp:965:3 frame #52: 0x000055555b680043 clangd`clang::clangd::TUScheduler::update(this=0x00007fffffffdbe8, File=(Data = "<stripped>", Length = 71), Inputs=ParseInputs @ 0x00007fffffffc7e8, WantDiags=Yes) at TUScheduler.cpp:1690:15 frame #53: 0x000055555b13d251 clangd`clang::clangd::ClangdServer::addDocument(this=0x00007fffffffda98, File=(Data = "<stripped>", Length = 71), Contents=(Data = "#include \"admarket/libadmarket/AdMarket.h\"\n#include <iosfwd>\n#include \"common/crypt/Crypt.h\"\n#include \"common/time/TimeConstants.h\"\n\nusing namespace std;\n\nnamespace facebook {\nnamespace admarket {\n\nconst int64_t kFbUidSidFbType = 18833;\n\nconst int32_t kAdMarketMinDbId = 51001;\n\nconst int32_t kAdmonitorEventDelayedSecs =\n    kSecondsPerHour * 1 + kSecondsPerMinute * 45;\n\nconst int32_t kAdmonitorFeedEventDelayedSecs = kSecondsPerDay;\nconst int32_t kAdmonitorFlagDelayedSecs = kSecondsPerDay;\n\n// Max bid is set to $1000 USD\nconst int32_t kAdMarketMaxBidScaledUsd = 1000000;\n\nconst int32_t kAdMarketMaxBidScaledNative = 1000000000; // 1e9\n\nconst int32_t kAdMarketMaxPriceNative = 1000000000; // 1e9\n\nconst double kCPMScalerUp = 1000.0;\nconst double kCPMScalerDown = 1.0 / kCPMScalerUp;\n\nconst int64_t kFb303Scaling{1000000};\n\nconst int32_t kCorrectedImpScaler = 1000;\n\nconst double kMaxPrClickAdjustment = 3.0;\nconst double kMinPrClickAdjustment = 1e-6;\n\nconst double kMinPrImpression = 1e-6;\nconst double kMinEctr = 1e-7;\n"..., Length = 1665), Version=(Data = "1", Length = 1), WantDiags=Yes, ForceRebuild=false) at ClangdServer.cpp:277:33 frame #54: 0x000055555b090455 clangd`clang::clangd::ClangdLSPServer::onDocumentDidOpen(this=0x00007fffffffd480, Params=0x00007fffffffcc00) at ClangdLSPServer.cpp:665:11 frame #55: 0x000055555b11b4ac clangd`void clang::clangd::LSPBinder::notification<clang::clangd::DidOpenTextDocumentParams, clang::clangd::ClangdLSPServer>(this=0x000055555f4e7090, RawParams=clang::clangd::LSPBinder::JSON @ 0x00007fffffffcca0)(clang::clangd::DidOpenTextDocumentParams const&))::'lambda'(llvm::json::Value)::operator()(llvm::json::Value) const at LSPBinder.h:153:5 frame #56: 0x000055555b11b34a clangd`void llvm::detail::UniqueFunctionBase<void, llvm::json::Value>::CallImpl<void clang::clangd::LSPBinder::notification<clang::clangd::DidOpenTextDocumentParams, clang::clangd::ClangdLSPServer>(llvm::StringLiteral, clang::clangd::ClangdLSPServer*, void (clang::clangd::ClangdLSPServer::*)(clang::clangd::DidOpenTextDocumentParams const&))::'lambda'(llvm::json::Value)>(CallableAddr=0x000055555f4e7090, Params=0x00007fffffffcd88) at FunctionExtras.h:221:12 frame #57: 0x000055555b0c7447 clangd`llvm::unique_function<void (llvm::json::Value)>::operator()(this=0x000055555f4e70c8, Params=Value @ 0x00007fffffffcd88) at FunctionExtras.h:383:12 frame #58: 0x000055555b0c61b5 clangd`clang::clangd::ClangdLSPServer::MessageHandler::onNotify(this=0x000055555f44a180, Method=(Data = "textDocument/didOpen", Length = 20), Params=Value @ 0x00007fffffffcf20) at ClangdLSPServer.cpp:168:7 frame #59: 0x000055555b44a5ba clangd`clang::clangd::(anonymous namespace)::JSONTransport::handleMessage(this=0x000055555f443d90, Message=Value @ 0x00007fffffffd258, Handler=0x000055555f44a180) at JSONTransport.cpp:196:18 frame #60: 0x000055555b4494fd clangd`clang::clangd::(anonymous namespace)::JSONTransport::loop(this=0x000055555f443d90, Handler=0x000055555f44a180) at JSONTransport.cpp:120:16 frame #61: 0x000055555b095300 clangd`clang::clangd::ClangdLSPServer::run(this=0x00007fffffffd480) at ClangdLSPServer.cpp:1649:25 frame #62: 0x0000555558a33168 clangd`main(argc=8, argv=0x00007fffffffebe8) at ClangdMain.cpp:1028:28 frame #63: 0x00007ffff583ad85 libc.so.6`__libc_start_main + 229 frame #64: 0x00005555586cf92e clangd`_start + 46

Test Plan:
check-clang


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D146156

Files:
  clang/lib/Lex/HeaderSearch.cpp


Index: clang/lib/Lex/HeaderSearch.cpp
===================================================================
--- clang/lib/Lex/HeaderSearch.cpp
+++ clang/lib/Lex/HeaderSearch.cpp
@@ -378,15 +378,17 @@
   llvm::StringMap<unsigned, llvm::BumpPtrAllocator> Index(SearchDirs.size());
 
   // Iterate over all filename keys and associate them with the index i.
-  unsigned i = 0;
-  for (; i != SearchDirs.size(); ++i) {
+  for (unsigned i = 0; i != SearchDirs.size(); ++i) {
     auto &Dir = SearchDirs[i];
 
     // We're concerned with only the initial contiguous run of header
     // maps within SearchDirs, which can be 99% of SearchDirs when
     // SearchDirs.size() is ~10000.
-    if (!Dir.isHeaderMap())
+    if (!Dir.isHeaderMap()) {
+      SearchDirHeaderMapIndex = std::move(Index);
+      FirstNonHeaderMapSearchDirIdx = i;
       break;
+    }
 
     // Give earlier keys precedence over identical later keys.
     auto Callback = [&](StringRef Filename) {
@@ -394,9 +396,6 @@
     };
     Dir.getHeaderMap()->forEachKey(Callback);
   }
-
-  SearchDirHeaderMapIndex = std::move(Index);
-  FirstNonHeaderMapSearchDirIdx = i;
 }
 
 //===----------------------------------------------------------------------===//
@@ -1929,7 +1928,7 @@
     llvm::StringRef File, llvm::StringRef WorkingDir, llvm::StringRef MainFile,
     bool *IsSystem) {
   using namespace llvm::sys;
-  
+
   llvm::SmallString<32> FilePath = File;
   // remove_dots switches to backslashes on windows as a side-effect!
   // We always want to suggest forward slashes for includes.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146156.505567.patch
Type: text/x-patch
Size: 1556 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230315/f95472a1/attachment-0001.bin>


More information about the cfe-commits mailing list