| author | |
| committer | |
| log | fc8791c133c14fe969b9056d8f0e337094ce1461 |
| tree | 2748fac999f47ea06ba9a892ae3734ca69ace042 |
| parent | b87c3d5371a277a60e63dc521a44d488f013dbc8 |
This small change makes working with tuple types much easier, allowing
the use of anonymous (eg. obtained with meta.ArgsTuple) tuples in more
places without the need for specifying each (quoted!) field name in the
initializer.2 files changed, 37 insertions(+), 1 deletions(-)
src/stage1/ir.cpp+1-1| ... | @@ -16694,7 +16694,7 @@ static IrInstGen *ir_analyze_instruction_container_init_list(IrAnalyze *ira, | ... | @@ -16694,7 +16694,7 @@ static IrInstGen *ir_analyze_instruction_container_init_list(IrAnalyze *ira, |
| 16694 | { | 16694 | { |
| 16695 | // We're now done inferring the type. | 16695 | // We're now done inferring the type. |
| 16696 | container_type->data.structure.resolve_status = ResolveStatusUnstarted; | 16696 | container_type->data.structure.resolve_status = ResolveStatusUnstarted; |
| 16697 | } else if (container_type->id == ZigTypeIdVector) { | 16697 | } else if (container_type->id == ZigTypeIdVector || is_tuple(container_type)) { |
| 16698 | // OK | 16698 | // OK |
| 16699 | } else { | 16699 | } else { |
| 16700 | ir_add_error(ira, &instruction->base.base, | 16700 | ir_add_error(ira, &instruction->base.base, |
test/behavior/tuple.zig+36| ... | @@ -111,3 +111,39 @@ test "tuple initializer for var" { | ... | @@ -111,3 +111,39 @@ test "tuple initializer for var" { |
| 111 | S.doTheTest(); | 111 | S.doTheTest(); |
| 112 | comptime S.doTheTest(); | 112 | comptime S.doTheTest(); |
| 113 | } | 113 | } |
| 114 | |||
| 115 | test "array-like initializer for tuple types" { | ||
| 116 | const T = @Type(std.builtin.TypeInfo{ | ||
| 117 | .Struct = std.builtin.TypeInfo.Struct{ | ||
| 118 | .is_tuple = true, | ||
| 119 | .layout = .Auto, | ||
| 120 | .decls = &[_]std.builtin.TypeInfo.Declaration{}, | ||
| 121 | .fields = &[_]std.builtin.TypeInfo.StructField{ | ||
| 122 | .{ | ||
| 123 | .name = "0", | ||
| 124 | .field_type = i32, | ||
| 125 | .default_value = @as(?i32, null), | ||
| 126 | .is_comptime = false, | ||
| 127 | .alignment = @alignOf(i32), | ||
| 128 | }, | ||
| 129 | .{ | ||
| 130 | .name = "1", | ||
| 131 | .field_type = u8, | ||
| 132 | .default_value = @as(?i32, null), | ||
| 133 | .is_comptime = false, | ||
| 134 | .alignment = @alignOf(i32), | ||
| 135 | }, | ||
| 136 | }, | ||
| 137 | }, | ||
| 138 | }); | ||
| 139 | const S = struct { | ||
| 140 | fn doTheTest() !void { | ||
| 141 | var obj: T = .{ -1234, 128 }; | ||
| 142 | try testing.expectEqual(@as(i32, -1234), obj[0]); | ||
| 143 | try testing.expectEqual(@as(u8, 128), obj[1]); | ||
| 144 | } | ||
| 145 | }; | ||
| 146 | |||
| 147 | try S.doTheTest(); | ||
| 148 | comptime try S.doTheTest(); | ||
| 149 | } |