summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-11-29 22:02:12 +0000
committerBram Moolenaar <Bram@vim.org>2021-11-29 22:02:12 +0000
commitc750d91a07ace532e993349aa5c13dda5c888cc0 (patch)
tree6627430830249d7c4733084063ac11f46529ce95
parent6b839ac77586f69a814d2940f59f0125f55c5f81 (diff)
downloadvim-git-8.2.3701.tar.gz
patch 8.2.3701: Vim9: invalid LHS is not possiblev8.2.3701
Problem: Vim9: invalid LHS is not possible. Solution: Remove unreachable error message.
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c57
2 files changed, 26 insertions, 33 deletions
diff --git a/src/version.c b/src/version.c
index c7daabc0d..b8dbf37b5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3701,
+/**/
3700,
/**/
3699,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 2c4e2030b..e5e806cb6 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -6503,52 +6503,43 @@ compile_lhs(
lhs->lhs_member_type = lhs->lhs_type;
if (lhs->lhs_has_index)
{
+ char_u *after = var_start + lhs->lhs_varlen;
+ char_u *p;
+
// Something follows after the variable: "var[idx]" or "var.key".
- // TODO: should we also handle "->func()" here?
if (is_decl)
{
emsg(_(e_cannot_use_index_when_declaring_variable));
return FAIL;
}
- if (var_start[lhs->lhs_varlen] == '['
- || var_start[lhs->lhs_varlen] == '.')
+ // Now: var_start[lhs->lhs_varlen] is '[' or '.'
+ // Only the last index is used below, if there are others
+ // before it generate code for the expression. Thus for
+ // "ll[1][2]" the expression is "ll[1]" and "[2]" is the index.
+ for (;;)
{
- char_u *after = var_start + lhs->lhs_varlen;
- char_u *p;
-
- // Only the last index is used below, if there are others
- // before it generate code for the expression. Thus for
- // "ll[1][2]" the expression is "ll[1]" and "[2]" is the index.
- for (;;)
- {
- p = skip_index(after);
- if (*p != '[' && *p != '.')
- {
- lhs->lhs_varlen_total = p - var_start;
- break;
- }
- after = p;
- }
- if (after > var_start + lhs->lhs_varlen)
+ p = skip_index(after);
+ if (*p != '[' && *p != '.')
{
- lhs->lhs_varlen = after - var_start;
- lhs->lhs_dest = dest_expr;
- // We don't know the type before evaluating the expression,
- // use "any" until then.
- lhs->lhs_type = &t_any;
+ lhs->lhs_varlen_total = p - var_start;
+ break;
}
-
- if (lhs->lhs_type->tt_member == NULL)
- lhs->lhs_member_type = &t_any;
- else
- lhs->lhs_member_type = lhs->lhs_type->tt_member;
+ after = p;
}
- else
+ if (after > var_start + lhs->lhs_varlen)
{
- semsg("Not supported yet: %s", var_start);
- return FAIL;
+ lhs->lhs_varlen = after - var_start;
+ lhs->lhs_dest = dest_expr;
+ // We don't know the type before evaluating the expression,
+ // use "any" until then.
+ lhs->lhs_type = &t_any;
}
+
+ if (lhs->lhs_type->tt_member == NULL)
+ lhs->lhs_member_type = &t_any;
+ else
+ lhs->lhs_member_type = lhs->lhs_type->tt_member;
}
return OK;
}