Author: Sudharsan Veeravalli Date: 2024-02-29T09:40:27Z New Revision: de5518836e16be3fbfce78394adc96d9bf70f2a5
URL: https://github.com/llvm/llvm-project/commit/de5518836e16be3fbfce78394adc96d9bf70f2a5 DIFF: https://github.com/llvm/llvm-project/commit/de5518836e16be3fbfce78394adc96d9bf70f2a5.diff LOG: [LLDB] Fix crash when using tab completion on class variables (#83234) We weren't checking to see if the partial_path was empty before adding completions and this led to crashes when the class object and a variable both start with the same substring. Fixes [#81536](https://github.com/llvm/llvm-project/issues/81536) --------- Co-authored-by: Michael Buch <michaelbuc...@gmail.com> Added: Modified: lldb/source/Symbol/Variable.cpp lldb/test/API/functionalities/completion/TestCompletion.py lldb/test/API/functionalities/completion/main.cpp Removed: ################################################################################ diff --git a/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp index 2bb2ff7db4b721..a33c3433d9e245 100644 --- a/lldb/source/Symbol/Variable.cpp +++ b/lldb/source/Symbol/Variable.cpp @@ -509,15 +509,17 @@ static void PrivateAutoCompleteMembers( CompilerType member_compiler_type = compiler_type.GetFieldAtIndex( i, member_name, nullptr, nullptr, nullptr); - if (partial_member_name.empty() || - llvm::StringRef(member_name).starts_with(partial_member_name)) { + if (partial_member_name.empty()) { + request.AddCompletion((prefix_path + member_name).str()); + } else if (llvm::StringRef(member_name) + .starts_with(partial_member_name)) { if (member_name == partial_member_name) { PrivateAutoComplete( frame, partial_path, prefix_path + member_name, // Anything that has been resolved // already will be in here member_compiler_type.GetCanonicalType(), request); - } else { + } else if (partial_path.empty()) { request.AddCompletion((prefix_path + member_name).str()); } } diff --git a/lldb/test/API/functionalities/completion/TestCompletion.py b/lldb/test/API/functionalities/completion/TestCompletion.py index f71bc73928f0f4..2f6af3cfce109d 100644 --- a/lldb/test/API/functionalities/completion/TestCompletion.py +++ b/lldb/test/API/functionalities/completion/TestCompletion.py @@ -60,10 +60,12 @@ def test_dwim_print(self): def do_test_variable_completion(self, command): self.complete_from_to(f"{command} fo", f"{command} fooo") - self.complete_from_to(f"{command} fooo.", f"{command} fooo.") + self.complete_from_to(f"{command} fooo.", f"{command} fooo.t") + self.complete_from_to(f"{command} fooo.t.", f"{command} fooo.t.x") self.complete_from_to(f"{command} fooo.dd", f"{command} fooo.dd") - self.complete_from_to(f"{command} ptr_fooo->", f"{command} ptr_fooo->") + self.complete_from_to(f"{command} ptr_fooo->", f"{command} ptr_fooo->t") + self.complete_from_to(f"{command} ptr_fooo->t", f"{command} ptr_fooo->t.x") self.complete_from_to(f"{command} ptr_fooo->dd", f"{command} ptr_fooo->dd") self.complete_from_to(f"{command} cont", f"{command} container") diff --git a/lldb/test/API/functionalities/completion/main.cpp b/lldb/test/API/functionalities/completion/main.cpp index 06ff5773e8a9dc..f925c1d5acf31c 100644 --- a/lldb/test/API/functionalities/completion/main.cpp +++ b/lldb/test/API/functionalities/completion/main.cpp @@ -1,12 +1,17 @@ #include <iostream> +class Baz { +public: + int x; +}; + class Foo { public: - int Bar(int x, int y) - { - return x + y; - } + Baz t; + int temp; + + int Bar(int x, int y) { return x + y; } }; namespace { int Quux (void) { return 0; } } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits