summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test.toc8
-rw-r--r--types.c1
-rw-r--r--types.h11
3 files changed, 17 insertions, 3 deletions
diff --git a/test.toc b/test.toc
index d27fae6..8e611c0 100644
--- a/test.toc
+++ b/test.toc
@@ -1,6 +1,8 @@
-#include "std/mem.toc";
+Point ::= struct {
+ x, y: int;
+}
main ::= fn() {
- thing := new(int);
- del(thing);
+ p: Point;
+ use p;
}
diff --git a/types.c b/types.c
index b9c9ebd..109fa68 100644
--- a/types.c
+++ b/types.c
@@ -3480,6 +3480,7 @@ static Status types_stmt(Typer *tr, Statement *s) {
}
static void typer_create(Typer *tr, Evaluator *ev, ErrCtx *err_ctx, Allocator *allocr, Identifiers *idents) {
+ tr->used = NULL;
tr->block = NULL;
tr->blocks = NULL;
tr->fn = NULL;
diff --git a/types.h b/types.h
index 195c97e..0b0fcbb 100644
--- a/types.h
+++ b/types.h
@@ -1033,6 +1033,16 @@ typedef struct Evaluator {
ForeignFnManager ffmgr;
} Evaluator;
+/*
+Keeps track of use stmts.
+We need to keep track of the block so that
+it can be removed when we exit the block.
+*/
+typedef struct {
+ Statement *stmt;
+ Block *scope;
+} UsedExpr;
+
typedef struct Typer {
Allocator *allocr;
Evaluator *evalr;
@@ -1046,6 +1056,7 @@ typedef struct Typer {
ParsedFile *parsed_file;
Namespace *nms;
StrHashTable included_files; /* maps to IncludedFile */
+ UsedExpr *used; /* things which are currently being `use`d */
} Typer;
typedef struct CGenerator {