aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-08-31 11:12:41 +0100
committergingerBill <bill@gingerbill.org>2019-08-31 11:12:41 +0100
commit07ced1cf0eed9c30813d49dad0c33f29f0c161ef (patch)
tree27127571631b7572854915d7d4a01dbd3bfd3964 /src
parenta1d4ea7718d49cb0245a0fc77d6c781373a46238 (diff)
Fix variable dependency ordering issues caused by procedure literals
Diffstat (limited to 'src')
-rw-r--r--src/check_decl.cpp23
-rw-r--r--src/check_expr.cpp3
-rw-r--r--src/checker.cpp9
3 files changed, 26 insertions, 9 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index d87e6def0..b5b9dc61d 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -1190,17 +1190,24 @@ void check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *decl, Type *ty
check_scope_usage(ctx->checker, ctx->scope);
+#if 0
if (decl->parent != nullptr) {
- // NOTE(bill): Add the dependencies from the procedure literal (lambda)
- for_array(i, decl->deps.entries) {
- Entity *e = decl->deps.entries[i].ptr;
- ptr_set_add(&decl->parent->deps, e);
- }
- for_array(i, decl->type_info_deps.entries) {
- Type *t = decl->type_info_deps.entries[i].ptr;
- ptr_set_add(&decl->parent->type_info_deps, t);
+ Scope *ps = decl->parent->scope;
+ if (ps->flags & (ScopeFlag_File & ScopeFlag_Pkg & ScopeFlag_Global)) {
+ return;
+ } else {
+ // NOTE(bill): Add the dependencies from the procedure literal (lambda)
+ for_array(i, decl->deps.entries) {
+ Entity *e = decl->deps.entries[i].ptr;
+ ptr_set_add(&decl->parent->deps, e);
+ }
+ for_array(i, decl->type_info_deps.entries) {
+ Type *t = decl->type_info_deps.entries[i].ptr;
+ ptr_set_add(&decl->parent->type_info_deps, t);
+ }
}
}
+#endif
}
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 7c4c4e6e4..86cba0f94 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -4864,7 +4864,7 @@ isize add_dependencies_from_unpacking(CheckerContext *c, Entity **lhs, isize lhs
c->decl = decl; // will be reset by the 'defer' any way
for_array(k, decl->deps.entries) {
Entity *dep = decl->deps.entries[k].ptr;
- add_declaration_dependency(c, dep); // TODO(bill): Should this be here?
+ add_declaration_dependency(c, dep); // TODO(bill): Should this be here?
}
}
}
@@ -6519,6 +6519,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
decl = make_decl_info(ctx.allocator, ctx.scope, ctx.decl);
decl->proc_lit = node;
ctx.decl = decl;
+ defer (ctx.decl = ctx.decl->parent);
if (pl->tags != 0) {
error(node, "A procedure literal cannot have tags");
diff --git a/src/checker.cpp b/src/checker.cpp
index fc8cb5c63..9fa6d4555 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -1445,6 +1445,14 @@ void add_min_dep_type_info(Checker *c, Type *t) {
add_min_dep_type_info(c, t_type_info_float);
add_min_dep_type_info(c, t_f64);
break;
+ case Basic_quaternion128:
+ add_min_dep_type_info(c, t_type_info_float);
+ add_min_dep_type_info(c, t_f32);
+ break;
+ case Basic_quaternion256:
+ add_min_dep_type_info(c, t_type_info_float);
+ add_min_dep_type_info(c, t_f64);
+ break;
}
break;
@@ -1779,6 +1787,7 @@ Array<EntityGraphNode *> generate_entity_dependency_graph(CheckerInfo *info) {
EntityGraphNode *n = G[i];
n->index = i;
n->dep_count = n->succ.entries.count;
+
GB_ASSERT(n->dep_count >= 0);
}