zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8841a71aa675f76c0ff7658339872a5faa5e4d5b (tree)
parent 746435a9549b1dee6d39e73991592a26cdd582ac
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sat, 19 Feb 2022 15:08:59 -0700

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

Diffstat:
Mlib/std/fmt.zig | 1-
Msrc/AstGen.zig | 17++++++++++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)

diff --git 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 @@ -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); }