Patch 8.1.2401
Problem:    :cexpr does not handle | in expression.
Solution:   Remove EX_TRLBAR and set nextcmd pointer.
Files:      src/testdir/test_quickfix.vim, src/ex_cmds.h, src/quickfix.c


*** ../vim-8.1.2400/src/testdir/test_quickfix.vim       2019-11-29 
22:06:44.229570907 +0100
--- src/testdir/test_quickfix.vim       2019-12-06 21:09:53.843048446 +0100
***************
*** 100,106 ****
    " Populate the list and then try
    Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
                  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
!                 \ 'non-error 3', 'Xtestfile3:3:1:Line3']
  
    " List only valid entries
    let l = split(execute('Xlist', ''), "\n")
--- 100,106 ----
    " Populate the list and then try
    Xgetexpr ['non-error 1', 'Xtestfile1:1:3:Line1',
                  \ 'non-error 2', 'Xtestfile2:2:2:Line2',
!                 \ 'non-error| 3', 'Xtestfile3:3:1:Line3']
  
    " List only valid entries
    let l = split(execute('Xlist', ''), "\n")
***************
*** 112,118 ****
    let l = split(execute('Xlist!', ''), "\n")
    call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
                   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
!                  \ ' 5: non-error 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
  
    " List a range of errors
    let l = split(execute('Xlist 3,6', ''), "\n")
--- 112,118 ----
    let l = split(execute('Xlist!', ''), "\n")
    call assert_equal([' 1: non-error 1', ' 2 Xtestfile1:1 col 3: Line1',
                   \ ' 3: non-error 2', ' 4 Xtestfile2:2 col 2: Line2',
!                  \ ' 5: non-error| 3', ' 6 Xtestfile3:3 col 1: Line3'], l)
  
    " List a range of errors
    let l = split(execute('Xlist 3,6', ''), "\n")
***************
*** 556,562 ****
    Xexpr ""
    call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
    call assert_equal(0, g:Xgetlist({'size' : 0}).size)
!   Xaddexpr ['foo', 'bar', 'baz', 'quux', 'shmoo']
    call assert_equal(5, g:Xgetlist({'size' : 0}).size)
    Xlast
    call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
--- 556,562 ----
    Xexpr ""
    call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
    call assert_equal(0, g:Xgetlist({'size' : 0}).size)
!   Xaddexpr ['foo', 'bar', 'baz', 'quux', 'sh|moo']
    call assert_equal(5, g:Xgetlist({'size' : 0}).size)
    Xlast
    call assert_equal(5, g:Xgetlist({'idx' : 0}).idx)
***************
*** 4650,4662 ****
              \ "Xfile3:1:X3_L1\n" .
              \ "Entering dir c\n" .
              \ "Xfile4:2:X4_L2\n" .
!             \ "Leaving dir c\n" .
!             \ "Leaving dir Xtestdir\n"
    set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
!   cexpr lines
    call assert_equal(11, getqflist({'size' : 0}).size)
    call assert_equal(4, getqflist({'idx' : 0}).idx)
    call assert_equal('X2_L2', getline('.'))
    cnext
    call assert_equal(6, getqflist({'idx' : 0}).idx)
    call assert_equal('X1_L2', getline('.'))
--- 4650,4662 ----
              \ "Xfile3:1:X3_L1\n" .
              \ "Entering dir c\n" .
              \ "Xfile4:2:X4_L2\n" .
!             \ "Leaving dir c\n"
    set efm=%DEntering\ dir\ %f,%XLeaving\ dir\ %f,%f:%l:%m
!   cexpr lines .. "Leaving dir Xtestdir|\n" | let next = 1
    call assert_equal(11, getqflist({'size' : 0}).size)
    call assert_equal(4, getqflist({'idx' : 0}).idx)
    call assert_equal('X2_L2', getline('.'))
+   call assert_equal(1, next)
    cnext
    call assert_equal(6, getqflist({'idx' : 0}).idx)
    call assert_equal('X1_L2', getline('.'))
*** ../vim-8.1.2400/src/ex_cmds.h       2019-09-19 23:21:48.233926270 +0200
--- src/ex_cmds.h       2019-12-06 21:02:00.929244730 +0100
***************
*** 254,260 ****
        EX_RANGE|EX_WORD1|EX_TRLBAR,
        ADDR_OTHER),
  EXCMD(CMD_caddexpr,   "caddexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_TRLBAR,
        ADDR_NONE),
  EXCMD(CMD_caddfile,   "caddfile",     ex_cfile,
        EX_TRLBAR|EX_FILE1,
--- 254,260 ----
        EX_RANGE|EX_WORD1|EX_TRLBAR,
        ADDR_OTHER),
  EXCMD(CMD_caddexpr,   "caddexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM,
        ADDR_NONE),
  EXCMD(CMD_caddfile,   "caddfile",     ex_cfile,
        EX_TRLBAR|EX_FILE1,
***************
*** 296,302 ****
        EX_TRLBAR|EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_MODIFY,
        ADDR_LINES),
  EXCMD(CMD_cexpr,      "cexpr",        ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_TRLBAR|EX_BANG,
        ADDR_NONE),
  EXCMD(CMD_cfile,      "cfile",        ex_cfile,
        EX_TRLBAR|EX_FILE1|EX_BANG,
--- 296,302 ----
        EX_TRLBAR|EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_MODIFY,
        ADDR_LINES),
  EXCMD(CMD_cexpr,      "cexpr",        ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_BANG,
        ADDR_NONE),
  EXCMD(CMD_cfile,      "cfile",        ex_cfile,
        EX_TRLBAR|EX_FILE1|EX_BANG,
***************
*** 314,320 ****
        EX_RANGE|EX_WORD1|EX_TRLBAR,
        ADDR_OTHER),
  EXCMD(CMD_cgetexpr,   "cgetexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_TRLBAR,
        ADDR_NONE),
  EXCMD(CMD_chdir,      "chdir",        ex_cd,
        EX_BANG|EX_FILE1|EX_TRLBAR|EX_CMDWIN,
--- 314,320 ----
        EX_RANGE|EX_WORD1|EX_TRLBAR,
        ADDR_OTHER),
  EXCMD(CMD_cgetexpr,   "cgetexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM,
        ADDR_NONE),
  EXCMD(CMD_chdir,      "chdir",        ex_cd,
        EX_BANG|EX_FILE1|EX_TRLBAR|EX_CMDWIN,
***************
*** 746,752 ****
        EX_EXTRA|EX_TRLBAR|EX_CMDWIN,
        ADDR_NONE),
  EXCMD(CMD_laddexpr,   "laddexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_TRLBAR,
        ADDR_NONE),
  EXCMD(CMD_laddbuffer, "laddbuffer",   ex_cbuffer,
        EX_RANGE|EX_WORD1|EX_TRLBAR,
--- 746,752 ----
        EX_EXTRA|EX_TRLBAR|EX_CMDWIN,
        ADDR_NONE),
  EXCMD(CMD_laddexpr,   "laddexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM,
        ADDR_NONE),
  EXCMD(CMD_laddbuffer, "laddbuffer",   ex_cbuffer,
        EX_RANGE|EX_WORD1|EX_TRLBAR,
***************
*** 797,803 ****
        EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN,
        ADDR_NONE),
  EXCMD(CMD_lexpr,      "lexpr",        ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_TRLBAR|EX_BANG,
        ADDR_NONE),
  EXCMD(CMD_lfile,      "lfile",        ex_cfile,
        EX_TRLBAR|EX_FILE1|EX_BANG,
--- 797,803 ----
        EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN,
        ADDR_NONE),
  EXCMD(CMD_lexpr,      "lexpr",        ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_BANG,
        ADDR_NONE),
  EXCMD(CMD_lfile,      "lfile",        ex_cfile,
        EX_TRLBAR|EX_FILE1|EX_BANG,
***************
*** 815,821 ****
        EX_RANGE|EX_WORD1|EX_TRLBAR,
        ADDR_OTHER),
  EXCMD(CMD_lgetexpr,   "lgetexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM|EX_TRLBAR,
        ADDR_NONE),
  EXCMD(CMD_lgrep,      "lgrep",        ex_make,
        EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE,
--- 815,821 ----
        EX_RANGE|EX_WORD1|EX_TRLBAR,
        ADDR_OTHER),
  EXCMD(CMD_lgetexpr,   "lgetexpr",     ex_cexpr,
!       EX_NEEDARG|EX_WORD1|EX_NOTRLCOM,
        ADDR_NONE),
  EXCMD(CMD_lgrep,      "lgrep",        ex_make,
        EX_RANGE|EX_BANG|EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM|EX_TRLBAR|EX_XFILE,
*** ../vim-8.1.2400/src/quickfix.c      2019-12-05 21:10:33.723533573 +0100
--- src/quickfix.c      2019-12-06 21:10:07.662979794 +0100
***************
*** 7548,7554 ****
  
      // Evaluate the expression.  When the result is a string or a list we can
      // use it to fill the errorlist.
!     tv = eval_expr(eap->arg, NULL);
      if (tv != NULL)
      {
        if ((tv->v_type == VAR_STRING && tv->vval.v_string != NULL)
--- 7548,7554 ----
  
      // Evaluate the expression.  When the result is a string or a list we can
      // use it to fill the errorlist.
!     tv = eval_expr(eap->arg, &eap->nextcmd);
      if (tv != NULL)
      {
        if ((tv->v_type == VAR_STRING && tv->vval.v_string != NULL)
*** ../vim-8.1.2400/src/version.c       2019-12-06 20:43:22.833354093 +0100
--- src/version.c       2019-12-06 21:00:39.005542157 +0100
***************
*** 744,745 ****
--- 744,747 ----
  {   /* Add new patch number below this line */
+ /**/
+     2401,
  /**/

-- 
panic("Foooooooood fight!");
        -- In the kernel source aha1542.c, after detecting a bad segment list

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201912062012.xB6KC9Hg007143%40masaka.moolenaar.net.

Raspunde prin e-mail lui