aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-19 15:08:59 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-19 15:11:18 -0700
commit8841a71aa675f76c0ff7658339872a5faa5e4d5b (patch)
tree21b3dc18b72e6baa1b5230dcae9e32f7eabe781d /src
parent746435a9549b1dee6d39e73991592a26cdd582ac (diff)
downloadzig-8841a71aa675f76c0ff7658339872a5faa5e4d5b.tar.gz
zig-8841a71aa675f76c0ff7658339872a5faa5e4d5b.zip
AstGen: evaluate `comptime var` init expressions in a comptime context
Diffstat (limited to 'src')
-rw-r--r--src/AstGen.zig17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig
index 0652a6232f..bf34ce4780 100644
--- a/src/AstGen.zig
+++ b/src/AstGen.zig
@@ -319,6 +319,21 @@ fn reachableExpr(
node: Ast.Node.Index,
reachable_node: Ast.Node.Index,
) InnerError!Zir.Inst.Ref {
+ return reachableExprComptime(gz, scope, rl, node, reachable_node, false);
+}
+
+fn reachableExprComptime(
+ gz: *GenZir,
+ scope: *Scope,
+ rl: ResultLoc,
+ node: Ast.Node.Index,
+ reachable_node: Ast.Node.Index,
+ force_comptime: bool,
+) InnerError!Zir.Inst.Ref {
+ const prev_force_comptime = gz.force_comptime;
+ gz.force_comptime = prev_force_comptime or force_comptime;
+ defer gz.force_comptime = prev_force_comptime;
+
const result_inst = try expr(gz, scope, rl, node);
if (gz.refIsNoReturn(result_inst)) {
try gz.astgen.appendErrorNodeNotes(reachable_node, "unreachable code", .{}, &[_]u32{
@@ -2758,7 +2773,7 @@ fn varDecl(
resolve_inferred_alloc = alloc;
break :a .{ .alloc = alloc, .result_loc = .{ .inferred_ptr = alloc } };
};
- _ = try reachableExpr(gz, scope, var_data.result_loc, var_decl.ast.init_node, node);
+ _ = try reachableExprComptime(gz, scope, var_data.result_loc, var_decl.ast.init_node, node, is_comptime);
if (resolve_inferred_alloc != .none) {
_ = try gz.addUnNode(.resolve_inferred_alloc, resolve_inferred_alloc, node);
}