]> granicus.if.org Git - vim/commitdiff
patch 8.2.2897: Vim9: can use reserved words at the script level v8.2.2897
authorBram Moolenaar <Bram@vim.org>
Fri, 28 May 2021 19:06:08 +0000 (21:06 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 28 May 2021 19:06:08 +0000 (21:06 +0200)
Problem:    Vim9: can use reserved words at the script level.
Solution:   Check variable names for reserved words. (closes #8253)

src/eval.c
src/proto/vim9script.pro
src/testdir/test_vim9_assign.vim
src/version.c
src/vim9compile.c
src/vim9script.c

index 008b032cefc935f9988826f72d3f167733345db3..8e554354965ea8d310a5a8a7ec216ce8b30f2b31 100644 (file)
@@ -1309,6 +1309,9 @@ set_var_lval(
     {
        cc = *endp;
        *endp = NUL;
+       if (in_vim9script() && check_reserved_name(lp->ll_name) == FAIL)
+           return;
+
        if (lp->ll_blob != NULL)
        {
            int     error = FALSE, val;
index 2c4bd79606cc88574df924433788915124f29814..41bf1287a1573966bc67471d98db57482aa7c6a6 100644 (file)
@@ -18,4 +18,5 @@ void hide_script_var(scriptitem_T *si, int idx, int func_defined);
 void free_all_script_vars(scriptitem_T *si);
 svar_T *find_typval_in_script(typval_T *dest);
 int check_script_var_type(typval_T *dest, typval_T *value, char_u *name, where_T where);
+int check_reserved_name(char_u *name);
 /* vim: set ft=c : */
index fa418b2ce289b9480550bb1b8b52dd8d53459dd4..b8c64336389d638d0ef90bfe923a3351f724d5aa 100644 (file)
@@ -249,6 +249,13 @@ def Test_assignment()
   END
 enddef
 
+def Test_reserved_name()
+  for name in ['true', 'false', 'null']
+    CheckDefExecAndScriptFailure(['var ' .. name .. ' =  0'], 'E1034:')
+    CheckDefExecAndScriptFailure(['var ' .. name .. ': bool'], 'E1034:')
+  endfor
+enddef
+
 def Test_skipped_assignment()
   var lines =<< trim END
       for x in []
index b20a149fa7964fa1c17f4c1fc3971db74252d61d..da315bf138cac3dfe84bb59c238ddd1e0fdd74a0 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2897,
 /**/
     2896,
 /**/
index 995c1d7491ba28ee62c1d60d1e194a7e5d466c88..2ea487de78e0f2204ec7a311039dea17eb6da57a 100644 (file)
@@ -5594,14 +5594,6 @@ assignment_len(char_u *p, int *heredoc)
     return 0;
 }
 
-// words that cannot be used as a variable
-static char *reserved[] = {
-    "true",
-    "false",
-    "null",
-    NULL
-};
-
 /*
  * Generate the load instruction for "name".
  */
@@ -5995,16 +5987,9 @@ compile_lhs(
        }
        else
        {
-           int     idx;
-
            // No specific kind of variable recognized, just a name.
-           for (idx = 0; reserved[idx] != NULL; ++idx)
-               if (STRCMP(reserved[idx], lhs->lhs_name) == 0)
-               {
-                   semsg(_(e_cannot_use_reserved_name), lhs->lhs_name);
-                   return FAIL;
-               }
-
+           if (check_reserved_name(lhs->lhs_name) == FAIL)
+               return FAIL;
 
            if (lookup_local(var_start, lhs->lhs_varlen,
                                             &lhs->lhs_local_lvar, cctx) == OK)
index 02c04e2ea7a6d6750f4a3bf25cc9957ae4af153f..fbb815c28e287df86ae1b69a2ae7c861958ec813 100644 (file)
@@ -709,10 +709,10 @@ vim9_declare_scriptvar(exarg_T *eap, char_u *arg)
     }
     name = vim_strnsave(arg, p - arg);
 
-    // parse type
+    // parse type, check for reserved name
     p = skipwhite(p + 1);
     type = parse_type(&p, &si->sn_type_list, TRUE);
-    if (type == NULL)
+    if (type == NULL || check_reserved_name(name) == FAIL)
     {
        vim_free(name);
        return p;
@@ -974,4 +974,26 @@ check_script_var_type(
     return OK; // not really
 }
 
+// words that cannot be used as a variable
+static char *reserved[] = {
+    "true",
+    "false",
+    "null",
+    NULL
+};
+
+    int
+check_reserved_name(char_u *name)
+{
+    int idx;
+
+    for (idx = 0; reserved[idx] != NULL; ++idx)
+       if (STRCMP(reserved[idx], name) == 0)
+       {
+           semsg(_(e_cannot_use_reserved_name), name);
+           return FAIL;
+       }
+    return OK;
+}
+
 #endif // FEAT_EVAL