diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-02-19 15:08:59 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-02-19 15:11:18 -0700 |
| commit | 8841a71aa675f76c0ff7658339872a5faa5e4d5b (patch) | |
| tree | 21b3dc18b72e6baa1b5230dcae9e32f7eabe781d | |
| parent | 746435a9549b1dee6d39e73991592a26cdd582ac (diff) | |
| download | zig-8841a71aa675f76c0ff7658339872a5faa5e4d5b.tar.gz zig-8841a71aa675f76c0ff7658339872a5faa5e4d5b.zip | |
AstGen: evaluate `comptime var` init expressions in a comptime context
| -rw-r--r-- | lib/std/fmt.zig | 1 | ||||
| -rw-r--r-- | 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); } |
