diff --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp --- a/lldb/source/Host/common/Editline.cpp +++ b/lldb/source/Host/common/Editline.cpp @@ -153,6 +153,11 @@ result.push_back(input.substr(start, end - start)); start = end + 1; } + // Treat an empty history session as a single command of zero-length instead + // of returning an empty vector. + if (result.empty()) { + result.emplace_back(); + } return result; } diff --git a/lldb/test/API/commands/expression/multiline-navigation/TestMultilineNavigation.py b/lldb/test/API/commands/expression/multiline-navigation/TestMultilineNavigation.py --- a/lldb/test/API/commands/expression/multiline-navigation/TestMultilineNavigation.py +++ b/lldb/test/API/commands/expression/multiline-navigation/TestMultilineNavigation.py @@ -69,3 +69,26 @@ self.child.expect_exact("(int) $0 = 334") self.quit() + + @skipIfAsan + @skipIfEditlineSupportMissing + @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr48316') + def test_nav_arrow_up_empty_pr49845(self): + """Tests that navigating with the up arrow doesn't crash.""" + self.launch() + + # Create an empty history session by only entering a newline. + self.child.sendline("expr") + self.child.expect_exact("terminate with an empty line to evaluate") + self.child.send("\n") + self.expect_prompt() + + # Send just the up arrow in the expression evaluator. This should bring up the previous empty expression. + self.child.sendline("expr") + self.child.expect_exact("terminate with an empty line to evaluate") + self.child.send(self.arrow_up) + self.child.expect_exact("1: ") + self.child.send("\n") + self.expect_prompt() + + self.quit()