authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-19 15:08:59-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-19 15:11:18-07:00
log8841a71aa675f76c0ff7658339872a5faa5e4d5b
tree21b3dc18b72e6baa1b5230dcae9e32f7eabe781d
parent746435a9549b1dee6d39e73991592a26cdd582ac

AstGen: evaluate `comptime var` init expressions in a comptime context


2 files changed, 16 insertions(+), 2 deletions(-)

lib/std/fmt.zig-1
...@@ -77,7 +77,6 @@ pub fn format(...@@ -77,7 +77,6 @@ pub fn format(
77) !void {77) !void {
78 const ArgsType = @TypeOf(args);78 const ArgsType = @TypeOf(args);
79 const args_type_info = @typeInfo(ArgsType);79 const args_type_info = @typeInfo(ArgsType);
80 // XXX: meta.trait.is(.Struct)(ArgsType) doesn't seem to work...
81 if (args_type_info != .Struct) {80 if (args_type_info != .Struct) {
82 @compileError("Expected tuple or struct argument, found " ++ @typeName(ArgsType));81 @compileError("Expected tuple or struct argument, found " ++ @typeName(ArgsType));
83 }82 }
src/AstGen.zig+16-1
...@@ -319,6 +319,21 @@ fn reachableExpr(...@@ -319,6 +319,21 @@ fn reachableExpr(
319 node: Ast.Node.Index,319 node: Ast.Node.Index,
320 reachable_node: Ast.Node.Index,320 reachable_node: Ast.Node.Index,
321) InnerError!Zir.Inst.Ref {321) InnerError!Zir.Inst.Ref {
322 return reachableExprComptime(gz, scope, rl, node, reachable_node, false);
323}
324
325fn reachableExprComptime(
326 gz: *GenZir,
327 scope: *Scope,
328 rl: ResultLoc,
329 node: Ast.Node.Index,
330 reachable_node: Ast.Node.Index,
331 force_comptime: bool,
332) InnerError!Zir.Inst.Ref {
333 const prev_force_comptime = gz.force_comptime;
334 gz.force_comptime = prev_force_comptime or force_comptime;
335 defer gz.force_comptime = prev_force_comptime;
336
322 const result_inst = try expr(gz, scope, rl, node);337 const result_inst = try expr(gz, scope, rl, node);
323 if (gz.refIsNoReturn(result_inst)) {338 if (gz.refIsNoReturn(result_inst)) {
324 try gz.astgen.appendErrorNodeNotes(reachable_node, "unreachable code", .{}, &[_]u32{339 try gz.astgen.appendErrorNodeNotes(reachable_node, "unreachable code", .{}, &[_]u32{
...@@ -2758,7 +2773,7 @@ fn varDecl(...@@ -2758,7 +2773,7 @@ fn varDecl(
2758 resolve_inferred_alloc = alloc;2773 resolve_inferred_alloc = alloc;
2759 break :a .{ .alloc = alloc, .result_loc = .{ .inferred_ptr = alloc } };2774 break :a .{ .alloc = alloc, .result_loc = .{ .inferred_ptr = alloc } };
2760 };2775 };
2761 _ = try reachableExpr(gz, scope, var_data.result_loc, var_decl.ast.init_node, node);2776 _ = try reachableExprComptime(gz, scope, var_data.result_loc, var_decl.ast.init_node, node, is_comptime);
2762 if (resolve_inferred_alloc != .none) {2777 if (resolve_inferred_alloc != .none) {
2763 _ = try gz.addUnNode(.resolve_inferred_alloc, resolve_inferred_alloc, node);2778 _ = try gz.addUnNode(.resolve_inferred_alloc, resolve_inferred_alloc, node);
2764 }2779 }