diff --git a/clang-tools-extra/clangd/Quality.cpp b/clang-tools-extra/clangd/Quality.cpp --- a/clang-tools-extra/clangd/Quality.cpp +++ b/clang-tools-extra/clangd/Quality.cpp @@ -303,6 +303,8 @@ (SemaResult.Kind != CodeCompletionResult::RK_Pattern)) return; if (const NamedDecl *ND = SemaResult.getDeclaration()) { + if (hasUnstableLinkage(ND)) + return; auto ID = getSymbolID(ND); if (!ID) return; diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -1100,6 +1100,21 @@ )cpp"); } +TEST(CompletionTest, Issue1427Crash) { + // Need to provide main file signals to ensure that the branch in + // SymbolRelevanceSignals::computeASTSignals() that tries to + // compute a symbol ID is taken. + ASTSignals MainFileSignals; + CodeCompleteOptions Opts; + Opts.MainFileSignals = &MainFileSignals; + completions(R"cpp( + auto f = []() { + 1.0_^ + }; + )cpp", + {}, Opts); +} + TEST(CompletionTest, BacktrackCrashes) { // Sema calls code completion callbacks twice in these cases. auto Results = completions(R"cpp(