[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)
This commit is contained in:
parent
2d5c43ad48
commit
db68723804
|
@ -486,6 +486,9 @@ private:
|
||||||
// we need to complete 'forward<$1>($0)'.
|
// we need to complete 'forward<$1>($0)'.
|
||||||
return "($0)";
|
return "($0)";
|
||||||
|
|
||||||
|
if (Snippet->empty())
|
||||||
|
return "";
|
||||||
|
|
||||||
bool MayHaveArgList = Completion.Kind == CompletionItemKind::Function ||
|
bool MayHaveArgList = Completion.Kind == CompletionItemKind::Function ||
|
||||||
Completion.Kind == CompletionItemKind::Method ||
|
Completion.Kind == CompletionItemKind::Method ||
|
||||||
Completion.Kind == CompletionItemKind::Constructor ||
|
Completion.Kind == CompletionItemKind::Constructor ||
|
||||||
|
@ -524,8 +527,6 @@ private:
|
||||||
return *Snippet;
|
return *Snippet;
|
||||||
|
|
||||||
// Replace argument snippets with a simplified pattern.
|
// Replace argument snippets with a simplified pattern.
|
||||||
if (Snippet->empty())
|
|
||||||
return "";
|
|
||||||
if (MayHaveArgList) {
|
if (MayHaveArgList) {
|
||||||
// Functions snippets can be of 2 types:
|
// Functions snippets can be of 2 types:
|
||||||
// - containing only function arguments, e.g.
|
// - containing only function arguments, e.g.
|
||||||
|
|
|
@ -1014,6 +1014,23 @@ TEST(CodeCompleteTest, NoColonColonAtTheEnd) {
|
||||||
EXPECT_THAT(Results.Completions, Not(Contains(labeled("clang::"))));
|
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) {
|
TEST(CompletionTest, BacktrackCrashes) {
|
||||||
// Sema calls code completion callbacks twice in these cases.
|
// Sema calls code completion callbacks twice in these cases.
|
||||||
auto Results = completions(R"cpp(
|
auto Results = completions(R"cpp(
|
||||||
|
|
Loading…
Reference in a new issue