From 8841a71aa675f76c0ff7658339872a5faa5e4d5b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 19 Feb 2022 15:08:59 -0700 Subject: [PATCH] AstGen: evaluate `comptime var` init expressions in a comptime context --- lib/std/fmt.zig | 1 - src/AstGen.zig | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 240a3ad233..b6594f193c 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -77,7 +77,6 @@ pub fn format( ) !void { const ArgsType = @TypeOf(args); const args_type_info = @typeInfo(ArgsType); - // XXX: meta.trait.is(.Struct)(ArgsType) doesn't seem to work... if (args_type_info != .Struct) { @compileError("Expected tuple or struct argument, found " ++ @typeName(ArgsType)); } 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); }