aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/ui_compositor.c3
-rw-r--r--test/functional/ui/popupmenu_spec.lua17
2 files changed, 20 insertions, 0 deletions
diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c
index 325ad31eaf..9d3ec21949 100644
--- a/src/nvim/ui_compositor.c
+++ b/src/nvim/ui_compositor.c
@@ -312,6 +312,9 @@ ScreenGrid *ui_comp_mouse_focus(int row, int col)
static void compose_line(Integer row, Integer startcol, Integer endcol,
LineFlags flags)
{
+ // If rightleft is set, startcol may be -1. In such cases, the assertions
+ // will fail because no overlap is found. Adjust startcol to prevent it.
+ startcol = MAX(startcol, 0);
// in case we start on the right half of a double-width char, we need to
// check the left half. But skip it in output if it wasn't doublewidth.
int skipstart = 0, skipend = 0;
diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua
index 3f984ff943..0944bfc21a 100644
--- a/test/functional/ui/popupmenu_spec.lua
+++ b/test/functional/ui/popupmenu_spec.lua
@@ -9,6 +9,7 @@ local funcs = helpers.funcs
local get_pathsep = helpers.get_pathsep
local eq = helpers.eq
local pcall_err = helpers.pcall_err
+local eval = helpers.eval
describe('ui/ext_popupmenu', function()
local screen
@@ -2196,4 +2197,20 @@ describe('builtin popupmenu', function()
{2:-- INSERT --} |
]])
end)
+
+ it('does not crash when displayed in the last column with rightleft (#12032)', function()
+ local col = 30
+ local items = {'word', 'choice', 'text', 'thing'}
+ local max_len = 0
+ for _, v in ipairs(items) do
+ max_len = max_len < #v and #v or max_len
+ end
+ screen:try_resize(col, 8)
+ command('set rightleft')
+ command('call setline(1, repeat(" ", &columns - '..max_len..'))')
+ feed('$i')
+ funcs.complete(col - max_len, items)
+ feed('<c-y>')
+ eq(2, eval('1+1'))
+ end)
end)