patch 8.2.1015: popup filter gets key with modifier prepended

Problem:    Popup filter gets key with modifier prepended when using
            modifyOtherKeys.
Solution:   Remove the shift modifier when it is included in the key, also
            when the Alt or Meta modifier is used.
diff --git a/src/misc2.c b/src/misc2.c
index 41b9f71..649cb65 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2929,9 +2929,11 @@
     if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key))
     {
 	key = TOUPPER_ASC(key);
-	// With <C-S-a> and <A-S-a> we keep the shift modifier.
-	// With <S-a> and <S-A> we don't keep the shift modifier.
-	if (simplify || modifiers == MOD_MASK_SHIFT)
+	// With <C-S-a> we keep the shift modifier.
+	// With <S-a>, <A-S-a> and <S-A> we don't keep the shift modifier.
+	if (simplify || modifiers == MOD_MASK_SHIFT
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT)
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_META))
 	    modifiers &= ~MOD_MASK_SHIFT;
     }
 
diff --git a/src/term.c b/src/term.c
index c4ca33e..1556c2e 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4772,11 +4772,14 @@
     // Some keys already have Shift included, pass them as
     // normal keys.  Not when Ctrl is also used, because <C-H>
     // and <C-S-H> are different.
-    if (modifiers == MOD_MASK_SHIFT
+    // Also for <A-S-a> and <M-S-a>.
+    if ((modifiers == MOD_MASK_SHIFT
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT)
+		|| modifiers == (MOD_MASK_SHIFT | MOD_MASK_META))
 	    && ((key >= '@' && key <= 'Z')
 		|| key == '^' || key == '_'
 		|| (key >= '{' && key <= '~')))
-	modifiers = 0;
+	modifiers &= ~MOD_MASK_SHIFT;
 
     // When used with Ctrl we always make a letter upper case,
     // so that mapping <C-H> and <C-h> are the same.  Typing
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index 2188c2c..b6f718c 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -2079,9 +2079,9 @@
   " check size with wrapping lines
   call term_sendkeys(buf, "j")
   call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
-  call term_sendkeys(buf, "x")
 
   " clean up
+  call term_sendkeys(buf, "x")
   call StopVimInTerminal(buf)
   call delete('XtestPopupScroll')
 endfunc
@@ -3347,6 +3347,12 @@
   call feedkeys("\u301b", 'xt')
   call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
 
+  if has('unix')
+    " with modifyOtherKeys <M-S-a> does not include a modifier sequence
+    call feedkeys("\<Esc>[27;4;65~", 'Lx!')
+    call assert_equal([0xc3, 0x81], g:bytes)
+  endif
+
   call popup_clear()
   delfunc MyPopupFilter
   unlet g:bytes
diff --git a/src/version.c b/src/version.c
index 3ccf1dd..8b5ad4e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1015,
+/**/
     1014,
 /**/
     1013,