# HG changeset patch # User Bram Moolenaar # Date 1681332303 -7200 # Node ID daef00e8d99fd5a3535997800c7dda2979cb1099 # Parent 28d5f8e20ba6c773f23504e5ff3f075f11dd2c9d patch 9.0.1447: condition is always true Commit: https://github.com/vim/vim/commit/474891bc89e657100bd37c29129451a0e601879d Author: zeertzjq Date: Wed Apr 12 21:36:03 2023 +0100 patch 9.0.1447: condition is always true Problem: Condition is always true. Solution: Remove the useless condition. (closes https://github.com/vim/vim/issues/12253) diff --git a/src/evalvars.c b/src/evalvars.c --- a/src/evalvars.c +++ b/src/evalvars.c @@ -989,7 +989,6 @@ ex_let(exarg_T *eap) char_u *arg = eap->arg; char_u *expr = NULL; typval_T rettv; - int i; int var_count = 0; int semicolon = 0; char_u op[4]; @@ -1067,8 +1066,10 @@ ex_let(exarg_T *eap) list_vim_vars(&first); } set_nextcmd(eap, arg); + return; } - else if (expr[0] == '=' && expr[1] == '<' && expr[2] == '<') + + if (expr[0] == '=' && expr[1] == '<' && expr[2] == '<') { list_T *l = NULL; long cur_lnum = SOURCING_LNUM; @@ -1096,77 +1097,67 @@ ex_let(exarg_T *eap) } clear_tv(&rettv); } + return; + } + + evalarg_T evalarg; + int len = 1; + + CLEAR_FIELD(rettv); + + int cur_lnum; + + op[0] = '='; + op[1] = NUL; + if (*expr != '=') + { + if (vim9script && (flags & ASSIGN_NO_DECL) == 0) + { + // +=, /=, etc. require an existing variable + semsg(_(e_cannot_use_operator_on_new_variable_str), eap->arg); + } + else if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL) + { + op[0] = *expr; // +=, -=, *=, /=, %= or .= + ++len; + if (expr[0] == '.' && expr[1] == '.') // ..= + { + ++expr; + ++len; + } + } + expr += 2; } else + ++expr; + + if (vim9script && !eap->skip && (!VIM_ISWHITE(*argend) + || !IS_WHITE_OR_NUL(*expr))) { - evalarg_T evalarg; - int len = 1; - - CLEAR_FIELD(rettv); - i = FAIL; - if (has_assign || concat) - { - int cur_lnum; - - op[0] = '='; - op[1] = NUL; - if (*expr != '=') - { - if (vim9script && (flags & ASSIGN_NO_DECL) == 0) - { - // +=, /=, etc. require an existing variable - semsg(_(e_cannot_use_operator_on_new_variable_str), - eap->arg); - } - else if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL) - { - op[0] = *expr; // +=, -=, *=, /=, %= or .= - ++len; - if (expr[0] == '.' && expr[1] == '.') // ..= - { - ++expr; - ++len; - } - } - expr += 2; - } - else - ++expr; - - if (vim9script && !eap->skip && (!VIM_ISWHITE(*argend) - || !IS_WHITE_OR_NUL(*expr))) - { - vim_strncpy(op, expr - len, len); - semsg(_(e_white_space_required_before_and_after_str_at_str), - op, argend); - } - - if (eap->skip) - ++emsg_skip; - fill_evalarg_from_eap(&evalarg, eap, eap->skip); - expr = skipwhite_and_linebreak(expr, &evalarg); - cur_lnum = SOURCING_LNUM; - i = eval0(expr, &rettv, eap, &evalarg); - if (eap->skip) - --emsg_skip; - clear_evalarg(&evalarg, eap); - - // Restore the line number so that any type error is given for the - // declaration, not the expression. - SOURCING_LNUM = cur_lnum; - } - if (eap->skip) - { - if (i != FAIL) - clear_tv(&rettv); - } - else if (i != FAIL) - { - (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count, + vim_strncpy(op, expr - len, len); + semsg(_(e_white_space_required_before_and_after_str_at_str), + op, argend); + } + + if (eap->skip) + ++emsg_skip; + fill_evalarg_from_eap(&evalarg, eap, eap->skip); + expr = skipwhite_and_linebreak(expr, &evalarg); + cur_lnum = SOURCING_LNUM; + int eval_res = eval0(expr, &rettv, eap, &evalarg); + if (eap->skip) + --emsg_skip; + clear_evalarg(&evalarg, eap); + + // Restore the line number so that any type error is given for the + // declaration, not the expression. + SOURCING_LNUM = cur_lnum; + + if (!eap->skip && eval_res != FAIL) + (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count, flags, op); - clear_tv(&rettv); - } - } + if (eval_res != FAIL) + clear_tv(&rettv); } /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1447, +/**/ 1446, /**/ 1445,