Patch 8.2.2305
Problem:    Vim9: "++var" and "--var" are silently accepted.
Solution:   Give an error message.
Files:      src/vim9compile.c, src/eval.c, src/proto/eval.pro,
            src/testdir/test_vim9_expr.vim


*** ../vim-8.2.2304/src/vim9compile.c   2021-01-05 19:23:25.084642157 +0100
--- src/vim9compile.c   2021-01-05 21:59:49.355270443 +0100
***************
*** 3887,3894 ****
       * Skip '!', '-' and '+' characters.  They are handled later.
       */
      start_leader = *arg;
!     while (**arg == '!' || **arg == '-' || **arg == '+')
!       *arg = skipwhite(*arg + 1);
      end_leader = *arg;
  
      rettv->v_type = VAR_UNKNOWN;
--- 3887,3894 ----
       * Skip '!', '-' and '+' characters.  They are handled later.
       */
      start_leader = *arg;
!     if (eval_leader(arg, TRUE) == FAIL)
!       return FAIL;
      end_leader = *arg;
  
      rettv->v_type = VAR_UNKNOWN;
*** ../vim-8.2.2304/src/eval.c  2021-01-03 22:05:15.803884248 +0100
--- src/eval.c  2021-01-05 21:59:54.459255989 +0100
***************
*** 3188,3193 ****
--- 3188,3215 ----
      return OK;
  }
  
+     int
+ eval_leader(char_u **arg, int vim9)
+ {
+     char_u    *s = *arg;
+     char_u    *p = *arg;
+ 
+     while (*p == '!' || *p == '-' || *p == '+')
+     {
+       char_u *n = skipwhite(p + 1);
+ 
+       // ++, --, -+ and +- are not accepted in Vim9 script
+       if (vim9 && (*p == '-' || *p == '+') && (*n == '-' || *n == '+'))
+       {
+           semsg(_(e_invexpr2), s);
+           return FAIL;
+       }
+       p = n;
+     }
+     *arg = p;
+     return OK;
+ }
+ 
  /*
   * Handle sixth level expression:
   *  number            number constant
***************
*** 3243,3250 ****
       * Skip '!', '-' and '+' characters.  They are handled later.
       */
      start_leader = *arg;
!     while (**arg == '!' || **arg == '-' || **arg == '+')
!       *arg = skipwhite(*arg + 1);
      end_leader = *arg;
  
      if (**arg == '.' && (!isdigit(*(*arg + 1))
--- 3265,3272 ----
       * Skip '!', '-' and '+' characters.  They are handled later.
       */
      start_leader = *arg;
!     if (eval_leader(arg, in_vim9script()) == FAIL)
!       return FAIL;
      end_leader = *arg;
  
      if (**arg == '.' && (!isdigit(*(*arg + 1))
*** ../vim-8.2.2304/src/proto/eval.pro  2020-12-22 12:20:04.541293877 +0100
--- src/proto/eval.pro  2021-01-05 21:59:57.303247918 +0100
***************
*** 39,44 ****
--- 39,45 ----
  int eval1(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
  void eval_addblob(typval_T *tv1, typval_T *tv2);
  int eval_addlist(typval_T *tv1, typval_T *tv2);
+ int eval_leader(char_u **arg, int vim9);
  int check_can_index(typval_T *rettv, int evaluate, int verbose);
  int eval_index_inner(typval_T *rettv, int is_range, typval_T *var1, typval_T 
*var2, char_u *key, int keylen, int verbose);
  char_u *partial_name(partial_T *pt);
*** ../vim-8.2.2304/src/testdir/test_vim9_expr.vim      2021-01-05 
17:50:24.741302345 +0100
--- src/testdir/test_vim9_expr.vim      2021-01-05 22:05:04.694366617 +0100
***************
*** 2516,2526 ****
  
    assert_equal(6, +6)
    assert_equal(-6, -6)
-   assert_equal(6, --6)
-   assert_equal(6, -+-6)
-   assert_equal(-6, ---6)
    assert_equal(false, !-3)
!   assert_equal(true, !+-+0)
  enddef
  
  def Test_expr7_parens_vim9script()
--- 2516,2523 ----
  
    assert_equal(6, +6)
    assert_equal(-6, -6)
    assert_equal(false, !-3)
!   assert_equal(true, !+0)
  enddef
  
  def Test_expr7_parens_vim9script()
***************
*** 2539,2564 ****
  def Test_expr7_negate_add()
    assert_equal(-99, -99)
    assert_equal(-99, - 99)
-   assert_equal(99, --99)
-   assert_equal(99, -- 99)
-   assert_equal(99, - - 99)
    assert_equal(99, +99)
-   assert_equal(-99, -+99)
-   assert_equal(-99, -+ 99)
-   assert_equal(-99, - +99)
-   assert_equal(-99, - + 99)
-   assert_equal(-99, +-99)
-   assert_equal(-99, + -99)
-   assert_equal(-99, + - 99)
  
    var nr = 88
    assert_equal(-88, -nr)
    assert_equal(-88, - nr)
-   assert_equal(-88, - +nr)
-   assert_equal(88, -- nr)
    assert_equal(88, + nr)
!   assert_equal(88, --+ nr)
!   assert_equal(88, - - nr)
  enddef
  
  def Echo(arg: any): string
--- 2536,2591 ----
  def Test_expr7_negate_add()
    assert_equal(-99, -99)
    assert_equal(-99, - 99)
    assert_equal(99, +99)
  
    var nr = 88
    assert_equal(-88, -nr)
    assert_equal(-88, - nr)
    assert_equal(88, + nr)
! 
!   var lines =<< trim END
!     var n = 12
!     echo ++n
!   END
!   CheckDefAndScriptFailure(lines, 'E15:')
!   lines =<< trim END
!     var n = 12
!     echo --n
!   END
!   CheckDefAndScriptFailure(lines, 'E15:')
!   lines =<< trim END
!     var n = 12
!     echo +-n
!   END
!   CheckDefAndScriptFailure(lines, 'E15:')
!   lines =<< trim END
!     var n = 12
!     echo -+n
!   END
!   CheckDefAndScriptFailure(lines, 'E15:')
!   lines =<< trim END
!     var n = 12
!     echo - -n
!   END
!   CheckDefAndScriptFailure(lines, 'E15:')
!   lines =<< trim END
!     var n = 12
!     echo + +n
!   END
!   CheckDefAndScriptFailure(lines, 'E15:')
! 
!   lines =<< trim END
!     var n = 12
!     :1
!     ++n
!   END
!   CheckDefAndScriptFailure(lines, 'E1050:')
!   lines =<< trim END
!     var n = 12
!     :1
!     --n
!   END
!   CheckDefAndScriptFailure(lines, 'E1050:')
  enddef
  
  def Echo(arg: any): string
***************
*** 2573,2579 ****
    var lines =<< trim END
        assert_equal('yes', 'yes'->Echo())
        assert_equal(true, !range(5)->empty())
!       assert_equal([0, 1, 2], --3->range())
    END
    CheckDefAndScriptSuccess(lines)
  
--- 2600,2606 ----
    var lines =<< trim END
        assert_equal('yes', 'yes'->Echo())
        assert_equal(true, !range(5)->empty())
!       assert_equal([0, 1, 2], 3->range())
    END
    CheckDefAndScriptSuccess(lines)
  
*** ../vim-8.2.2304/src/version.c       2021-01-05 20:58:20.855037677 +0100
--- src/version.c       2021-01-05 21:37:01.354745571 +0100
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2305,
  /**/

-- 
>From "know your smileys":
 |-(    Contact lenses, but has lost them

 /// 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/202101052108.105L8ml12868673%40masaka.moolenaar.net.

Raspunde prin e-mail lui