patch 8.1.0695: internal error when using :popup
Problem: Internal error when using :popup.
Solution: When a menu only exists in Terminal mode give an error. (Naruhiko
Nishino, closes #3765)
diff --git a/src/globals.h b/src/globals.h
index 2a7ecd1..3f67d13 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1583,6 +1583,9 @@
#endif
EXTERN char_u e_dirnotf[] INIT(= N_("E919: Directory not found in '%s': \"%s\""));
EXTERN char_u e_au_recursive[] INIT(= N_("E952: Autocommand caused recursive behavior"));
+#ifdef FEAT_MENU
+EXTERN char_u e_menuothermode[] INIT(= N_("E328: Menu only exists in another mode"));
+#endif
#ifdef FEAT_GUI_MAC
EXTERN short disallow_gui INIT(= FALSE);
diff --git a/src/menu.c b/src/menu.c
index 782235a..9442118 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -61,7 +61,6 @@
static char *menu_mode_chars[] = {"n", "v", "s", "o", "i", "c", "tl", "t"};
static char_u e_notsubmenu[] = N_("E327: Part of menu-item path is not sub-menu");
-static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
static char_u e_nomenu[] = N_("E329: No menu \"%s\"");
#ifdef FEAT_TOOLBAR
@@ -956,7 +955,7 @@
else if (*name != NUL)
{
if (!silent)
- EMSG(_(e_othermode));
+ EMSG(_(e_menuothermode));
return FAIL;
}
@@ -1130,7 +1129,7 @@
}
else if ((menu->modes & modes) == 0x0)
{
- EMSG(_(e_othermode));
+ EMSG(_(e_menuothermode));
vim_free(path_name);
return FAIL;
}
diff --git a/src/popupmnu.c b/src/popupmnu.c
index 6ef0af9..962a59a 100644
--- a/src/popupmnu.c
+++ b/src/popupmnu.c
@@ -1195,6 +1195,14 @@
|| (mp->modes & mp->enabled & mode))
++pum_size;
+ // When there are only Terminal mode menus, using "popup Edit" results in
+ // pum_size being zero.
+ if (pum_size <= 0)
+ {
+ EMSG(e_menuothermode);
+ return;
+ }
+
array = (pumitem_T *)alloc_clear((unsigned)sizeof(pumitem_T) * pum_size);
if (array == NULL)
return;
diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim
index 287d59d..663a6a8 100644
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -882,5 +882,18 @@
delfunc s:act_on_text_changed
endfunc
+func Test_menu_only_exists_in_terminal()
+ if !exists(':tlmenu') || has('gui_running')
+ return
+ endif
+ tlnoremenu &Edit.&Paste<Tab>"+gP <C-W>"+
+ aunmenu *
+ try
+ popup Edit
+ call assert_false(1, 'command should have failed')
+ catch
+ call assert_exception('E328:')
+ endtry
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 3450325..790c4f7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 695,
+/**/
694,
/**/
693,