diff options
author | Tom Praschan <13141438+tom-anders@users.noreply.github.com> | 2022-09-18 18:48:11 +0200 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2022-10-25 09:37:35 +0200 |
commit | db68723804fd30d5e7da1fb2ad2aab409ef58d29 (patch) | |
tree | 36bd5a3f786bb33181d1d5d1816eba4e33657f28 | |
parent | 2d5c43ad484482cd23794b8b056a9b13ee920369 (diff) | |
download | llvm-db68723804fd30d5e7da1fb2ad2aab409ef58d29.tar.gz |
[clangd] Return earlier when snippet is empty
Fixes github.com/clangd/clangd/issues/1216
If the Snippet string is empty, Snippet.front() would trigger a crash.
Move the Snippet->empty() check up a few lines to avoid this. Should not
break any existing behavior.
Differential Revision: https://reviews.llvm.org/D134137
(cherry picked from commit 60528c690a4c334d2a3a2c22eb97af9e67d7a91d)
-rw-r--r-- | clang-tools-extra/clangd/CodeComplete.cpp | 5 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp | 17 |
2 files changed, 20 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp index edbb1722ae38..55982f41250f 100644 --- a/clang-tools-extra/clangd/CodeComplete.cpp +++ b/clang-tools-extra/clangd/CodeComplete.cpp @@ -486,6 +486,9 @@ private: // we need to complete 'forward<$1>($0)'. return "($0)"; + if (Snippet->empty()) + return ""; + bool MayHaveArgList = Completion.Kind == CompletionItemKind::Function || Completion.Kind == CompletionItemKind::Method || Completion.Kind == CompletionItemKind::Constructor || @@ -524,8 +527,6 @@ private: return *Snippet; // Replace argument snippets with a simplified pattern. - if (Snippet->empty()) - return ""; if (MayHaveArgList) { // Functions snippets can be of 2 types: // - containing only function arguments, e.g. diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 5050ab203b8d..079a4ec70623 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -1014,6 +1014,23 @@ TEST(CodeCompleteTest, NoColonColonAtTheEnd) { EXPECT_THAT(Results.Completions, Not(Contains(labeled("clang::")))); } +TEST(CompletionTests, EmptySnippetDoesNotCrash) { + // See https://github.com/clangd/clangd/issues/1216 + auto Results = completions(R"cpp( + int main() { + auto w = [&](auto &&f) { return f(f); }; + auto f = w([&](auto &&f) { + return [&](auto &&n) { + if (n == 0) { + return 1; + } + return n * ^(f)(n - 1); + }; + })(10); + } + )cpp"); +} + TEST(CompletionTest, BacktrackCrashes) { // Sema calls code completion callbacks twice in these cases. auto Results = completions(R"cpp( |