diff options
-rw-r--r-- | src/nvim/ui_compositor.c | 3 | ||||
-rw-r--r-- | test/functional/ui/popupmenu_spec.lua | 17 |
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) |