aboutsummaryrefslogtreecommitdiff
path: root/src/move.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2026-03-13 14:07:29 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2026-03-13 14:09:53 +0200
commited7da0d9e31e8dd6847e2e603f0d1943330cf4d0 (patch)
tree16e4785bd92f43a37bed6b0028b0f239faa00d51 /src/move.c
parent25b8db28cf87708808744b97774c2a8427e129e2 (diff)
downloadfwd-ed7da0d9e31e8dd6847e2e603f0d1943330cf4d0.tar.gz
fwd-ed7da0d9e31e8dd6847e2e603f0d1943330cf4d0.zip
add initial reference invalidation
+ Makes vec example actually memory safe, which is cool + Specify owner > sub relationships with ">" in closure parameter lists, uses the same group idea as closure calls + Relies on users implementing functions in a consistent manner, since you can kind of do whatever with pointers. Presumably there would be a stdlib of vec/map/set etc. which applications could then use and by proxy be memory safe. Although some more checks wouldn't hurt, I suppose? + Not sure I like having reference invalidation be 'just a move', seems to work alright but the semantics of it are a bit muddy.
Diffstat (limited to 'src/move.c')
-rw-r--r--src/move.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/move.c b/src/move.c
index 5137719..a76ffd5 100644
--- a/src/move.c
+++ b/src/move.c
@@ -372,6 +372,19 @@ static int mvcheck_id(struct state *state, struct ast *node)
if (def->k != AST_VAR_DEF)
return 0;
+ struct ast_pair *prev = find_move(state, def);
+
+ /* a reference invalidation is represented as a 'moved'
+ * reference, which is not expressible within the
+ * language but is constructed as part of
+ * opt_group_left/opt_group_right forcing a move to
+ * happen. Hack? */
+ if (def->t->k == TYPE_REF && prev) {
+ /** @todo a more fitting error message? */
+ move_error(node, prev->use);
+ return -1;
+ }
+
if (is_trivially_copyable(def->t))
return 0;
@@ -381,7 +394,6 @@ static int mvcheck_id(struct state *state, struct ast *node)
return -1;
}
- struct ast_pair *prev = find_move(state, def);
if (prev) {
/* error messages for opt groups could be improved */
move_error(node, prev->use);