AstGen: fix const locals with comptime initializations

`const foo = comptime ...` generated invalid ZIR when the initialization
expression contained an array literal because the
validate_array_init_comptime instruction assumed that the corresponding
alloc instruction was comptime. The solution is to look slightly ahead
and notice that the initialization expression would be comptime-known
and affect the alloc instruction tag accordingly.
This commit is contained in:
Andrew Kelley
2022-03-24 17:45:34 -07:00
parent 9a1d5001d4
commit 5c68afef94
2 changed files with 25 additions and 3 deletions

View File

@@ -859,3 +859,22 @@ test "debug variable type resolved through indirect zero-bit types" {
const slice: []const T = &[_]T{};
_ = slice;
}
test "const local with comptime init through array init" {
const E1 = enum {
A,
fn a() void {}
};
const S = struct {
fn declarations(comptime T: type) []const std.builtin.Type.Declaration {
return @typeInfo(T).Enum.decls;
}
};
const decls = comptime [_][]const std.builtin.Type.Declaration{
S.declarations(E1),
};
try comptime expect(decls[0][0].name[0] == 'a');
}