aboutsummaryrefslogtreecommitdiff
path: root/src/AstGen.zig
diff options
context:
space:
mode:
authorJacob G-W <jacoblevgw@gmail.com>2021-06-15 18:06:14 -0400
committerAndrew Kelley <andrew@ziglang.org>2021-06-21 17:03:03 -0700
commitd34a1ccb0ea75ba31f374b8b2d34e18326b147b1 (patch)
tree7bb8d8b843840ff6ce7bb3311139d538340126e6 /src/AstGen.zig
parent18c1007a34e92c69fa87d3f2628fa076fae7941c (diff)
downloadzig-d34a1ccb0ea75ba31f374b8b2d34e18326b147b1.tar.gz
zig-d34a1ccb0ea75ba31f374b8b2d34e18326b147b1.zip
stage2: fix TODO in @export to look for runtime-vars
Also rename LocalPtr.is_comptime to LocalPtr.maybe_comptime as it is a better name, as it could be runtime, but is not always runtime.
Diffstat (limited to 'src/AstGen.zig')
-rw-r--r--src/AstGen.zig42
1 files changed, 33 insertions, 9 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig
index 12b3d3a1c3..09078b0c1e 100644
--- a/src/AstGen.zig
+++ b/src/AstGen.zig
@@ -2405,7 +2405,7 @@ fn varDecl(
.name = ident_name,
.ptr = init_scope.rl_ptr,
.token_src = name_token,
- .is_comptime = true,
+ .maybe_comptime = true,
};
return &sub_scope.base;
},
@@ -2461,7 +2461,7 @@ fn varDecl(
.name = ident_name,
.ptr = var_data.alloc,
.token_src = name_token,
- .is_comptime = is_comptime,
+ .maybe_comptime = is_comptime,
};
return &sub_scope.base;
},
@@ -5405,7 +5405,7 @@ fn forExpr(
.name = index_name,
.ptr = index_ptr,
.token_src = index_token,
- .is_comptime = is_inline,
+ .maybe_comptime = is_inline,
};
break :blk &index_scope.base;
};
@@ -6188,7 +6188,7 @@ fn identifier(
if (local_ptr.name == name_str_index) {
local_ptr.used = true;
if (hit_namespace) {
- if (local_ptr.is_comptime)
+ if (local_ptr.maybe_comptime)
break
else
return astgen.failNodeNotes(ident, "'{s}' not accessible from inner function", .{ident_name}, &.{
@@ -6836,9 +6836,32 @@ fn builtinCall(
.identifier => {
const ident_token = main_tokens[params[0]];
decl_name = try astgen.identAsString(ident_token);
- // TODO look for local variables in scope matching `decl_name` and emit a compile
- // error. Only top-level declarations can be exported. Until this is done, the
- // compile error will end up being "use of undeclared identifier" in Sema.
+ {
+ var s = scope;
+ while (true) switch (s.tag) {
+ .local_val => {
+ const local_val = s.cast(Scope.LocalVal).?;
+ if (local_val.name == decl_name) {
+ local_val.used = true;
+ break;
+ }
+ s = local_val.parent;
+ },
+ .local_ptr => {
+ const local_ptr = s.cast(Scope.LocalPtr).?;
+ if (local_ptr.name == decl_name) {
+ if (!local_ptr.maybe_comptime)
+ return astgen.failNode(params[0], "unable to export runtime-known value", .{});
+ local_ptr.used = true;
+ break;
+ }
+ s = local_ptr.parent;
+ },
+ .gen_zir => s = s.cast(GenZir).?.parent,
+ .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
+ .namespace, .top => break,
+ };
+ }
},
.field_access => {
const namespace_node = node_datas[params[0]].lhs;
@@ -6848,7 +6871,7 @@ fn builtinCall(
decl_name = try astgen.identAsString(field_ident);
},
else => return astgen.failNode(
- params[0], "the first @export parameter must be an identifier", .{},
+ params[0], "symbol to export must identify a declaration", .{},
),
}
const options = try comptimeExpr(gz, scope, .{ .ty = .export_options_type }, params[1]);
@@ -8431,7 +8454,8 @@ const Scope = struct {
token_src: ast.TokenIndex,
/// String table index.
name: u32,
- is_comptime: bool,
+ /// true means we find out during Sema whether the value is comptime. false means it is already known at AstGen the value is runtime-known.
+ maybe_comptime: bool,
/// has this variable been referenced?
used: bool = false,
};