From e77538515802276d76dfcb28c9b8dc140d5afe02 Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 30 Dec 2025 10:34:11 +0100 Subject: c: SYM expr should store decl ref as an index, not pointer Because envdecls (now declsbuf) can be resized and invalidate those pointers. I missed this because the default initialization size of that buffer (and the fact that it would mostly only manifest with function-local expressions) made it not really come up in practice. Silly --- c/c.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'c/c.h') diff --git a/c/c.h b/c/c.h index a31a1fd..da30616 100644 --- a/c/c.h +++ b/c/c.h @@ -45,7 +45,8 @@ struct expr { }; uint n; } s; /* ESTRLIT */ - struct decl *sym; /* ESYM */ + int decl; /* ESYM, index into declsbuf */ + internstr implicitsym; /* ESYM (undeclared) */ struct init *init; /* EINIT */ }; }; @@ -101,9 +102,10 @@ struct decl { }; }; +extern struct envdecls {vec_of(struct decl);} declsbuf; extern union type cvalistty; struct function; -struct decl *envadddecl(struct env *env, const struct decl *d); +int envadddecl(struct env *env, const struct decl *d); bool assigncheck(union type t, const struct expr *src); union ref expraddr(struct function *, const struct expr *); union ref compileexpr(struct function *, const struct expr *, bool discard); -- cgit v1.2.3