changeset 21903:1fc2ffadf412 v8.2.1501

patch 8.2.1501: Vim9: concatenating to constant reverses order Commit: https://github.com/vim/vim/commit/3fc71285d5ae7c16cf7be5d997fd1fe140f196da Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 21 20:43:17 2020 +0200 patch 8.2.1501: Vim9: concatenating to constant reverses order Problem: Vim9: concatenating to constant reverses order. Solution: Generate constant before option, register and environment variable. (closes #6757)
author Bram Moolenaar <Bram@vim.org>
date Fri, 21 Aug 2020 20:45:04 +0200
parents ef5cd8d9a8b3
children a0088959f40a
files src/testdir/test_vim9_expr.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -944,6 +944,18 @@ def Test_expr5()
   				+ g:ablob)
   assert_equal(0z01ab3344, g:ablob + 0z3344)
   assert_equal(0z01ab01ab, g:ablob + g:ablob)
+
+  # concatenate non-constant to constant
+  let save_path = &path
+  &path = 'b'
+  assert_equal('ab', 'a' .. &path)
+  &path = save_path
+
+  @b = 'b'
+  assert_equal('ab', 'a' .. @b)
+
+  $ENVVAR = 'env'
+  assert_equal('aenv', 'a' .. $ENVVAR)
 enddef
 
 def Test_expr5_vim9script()
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1501,
+/**/
     1500,
 /**/
     1499,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3402,19 +3402,25 @@ compile_expr7(
 	/*
 	 * Option value: &name
 	 */
-	case '&':	ret = compile_get_option(arg, cctx);
+	case '&':	if (generate_ppconst(cctx, ppconst) == FAIL)
+			    return FAIL;
+			ret = compile_get_option(arg, cctx);
 			break;
 
 	/*
 	 * Environment variable: $VAR.
 	 */
-	case '$':	ret = compile_get_env(arg, cctx);
+	case '$':	if (generate_ppconst(cctx, ppconst) == FAIL)
+			    return FAIL;
+			ret = compile_get_env(arg, cctx);
 			break;
 
 	/*
 	 * Register contents: @r.
 	 */
-	case '@':	ret = compile_get_register(arg, cctx);
+	case '@':	if (generate_ppconst(cctx, ppconst) == FAIL)
+			    return FAIL;
+			ret = compile_get_register(arg, cctx);
 			break;
 	/*
 	 * nested expression: (expression).