aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-11-15 23:54:18 +0000
committergingerBill <bill@gingerbill.org>2020-11-15 23:54:18 +0000
commit939878df50cf314dd2cd0e5da737ac93e88b5b25 (patch)
tree60bd61992a2447ad6a1c4dc8caf4b336f66b71b9 /src/check_expr.cpp
parent5fafb17d81c2bfb07402e04d34c717a7abf42f84 (diff)
Improve logic for x->y() shorthand
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 110e83ef2..11ccf2dab 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3437,6 +3437,13 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ
Entity *entity = nullptr;
Selection sel = {}; // NOTE(bill): Not used if it's an import name
+ if (!c->allow_arrow_right_selector_expr && se->token.kind == Token_ArrowRight) {
+ error(node, "Illegal use of -> selector shorthand outside of a call");
+ operand->mode = Addressing_Invalid;
+ operand->expr = node;
+ return nullptr;
+ }
+
operand->expr = node;
Ast *op_expr = se->expr;
@@ -9492,8 +9499,13 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
//
// NOTE(bill, 2020-05-22): I'm going to regret this decision, ain't I?
+ bool allow_arrow_right_selector_expr;
+ allow_arrow_right_selector_expr = c->allow_arrow_right_selector_expr;
+ c->allow_arrow_right_selector_expr = true;
Operand x = {};
ExprKind kind = check_expr_base(c, &x, se->expr, nullptr);
+ c->allow_arrow_right_selector_expr = allow_arrow_right_selector_expr;
+
if (x.mode == Addressing_Invalid || x.type == t_invalid) {
o->mode = Addressing_Invalid;
o->type = t_invalid;
@@ -9594,7 +9606,11 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
ce->args = modified_args;
se->modified_call = true;
+ allow_arrow_right_selector_expr = c->allow_arrow_right_selector_expr;
+ c->allow_arrow_right_selector_expr = true;
check_expr_base(c, o, se->call, type_hint);
+ c->allow_arrow_right_selector_expr = allow_arrow_right_selector_expr;
+
o->expr = node;
return Expr_Expr;
case_end;