authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-14 12:28:52-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-14 12:28:52-07:00
log5ea94e7715607e986298908536cdd3d9dfdd0ce9
treed2cf8e70d091d0bcf0fa200a5b0274881831b67b
parent1ebe3bd01d13b28b3ecd4962f0f70344fe75ba4d

stage2: rework Value storage of structs and arrays

Now they both use `Value.Tag.aggregate`. Additionally the LLVM backend now has implemented lowering of tuple values.

9 files changed, 213 insertions(+), 178 deletions(-)

src/Module.zig+2-2
...@@ -5385,7 +5385,7 @@ pub fn populateTestFunctions(mod: *Module) !void {...@@ -5385,7 +5385,7 @@ pub fn populateTestFunctions(mod: *Module) !void {
5385 .len = test_fn_vals.len,5385 .len = test_fn_vals.len,
5386 .elem_type = try tmp_test_fn_ty.copy(arena),5386 .elem_type = try tmp_test_fn_ty.copy(arena),
5387 }),5387 }),
5388 .val = try Value.Tag.array.create(arena, test_fn_vals),5388 .val = try Value.Tag.aggregate.create(arena, test_fn_vals),
5389 });5389 });
53905390
5391 // Add a dependency on each test name and function pointer.5391 // Add a dependency on each test name and function pointer.
...@@ -5417,7 +5417,7 @@ pub fn populateTestFunctions(mod: *Module) !void {...@@ -5417,7 +5417,7 @@ pub fn populateTestFunctions(mod: *Module) !void {
5417 try Value.Tag.decl_ref.create(arena, test_decl), // func5417 try Value.Tag.decl_ref.create(arena, test_decl), // func
5418 Value.initTag(.null_value), // async_frame_size5418 Value.initTag(.null_value), // async_frame_size
5419 };5419 };
5420 test_fn_vals[i] = try Value.Tag.@"struct".create(arena, field_vals);5420 test_fn_vals[i] = try Value.Tag.aggregate.create(arena, field_vals);
5421 }5421 }
54225422
5423 try array_decl.finalizeNewArena(&new_decl_arena);5423 try array_decl.finalizeNewArena(&new_decl_arena);
src/Sema.zig+73-73
...@@ -3119,7 +3119,7 @@ fn validateStructInit(...@@ -3119,7 +3119,7 @@ fn validateStructInit(
3119 field_values[i] = fields[i].default_val;3119 field_values[i] = fields[i].default_val;
3120 }3120 }
31213121
3122 const struct_val = try Value.Tag.@"struct".create(sema.arena, field_values);3122 const struct_val = try Value.Tag.aggregate.create(sema.arena, field_values);
3123 const struct_init = try sema.addConstant(struct_ty, struct_val);3123 const struct_init = try sema.addConstant(struct_ty, struct_val);
3124 try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store);3124 try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store);
3125 return;3125 return;
...@@ -3246,7 +3246,7 @@ fn zirValidateArrayInit(...@@ -3246,7 +3246,7 @@ fn zirValidateArrayInit(
32463246
3247 block.instructions.shrinkRetainingCapacity(first_block_index);3247 block.instructions.shrinkRetainingCapacity(first_block_index);
32483248
3249 const array_val = try Value.Tag.array.create(sema.arena, element_vals);3249 const array_val = try Value.Tag.aggregate.create(sema.arena, element_vals);
3250 const array_init = try sema.addConstant(array_ty, array_val);3250 const array_init = try sema.addConstant(array_ty, array_val);
3251 try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store);3251 try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store);
3252 }3252 }
...@@ -8175,7 +8175,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air....@@ -8175,7 +8175,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
8175 }8175 }
8176 return sema.addConstant(8176 return sema.addConstant(
8177 operand_type,8177 operand_type,
8178 try Value.Tag.array.create(sema.arena, elems),8178 try Value.Tag.aggregate.create(sema.arena, elems),
8179 );8179 );
8180 } else {8180 } else {
8181 const result_val = try val.bitwiseNot(scalar_type, sema.arena, target);8181 const result_val = try val.bitwiseNot(scalar_type, sema.arena, target);
...@@ -8239,7 +8239,7 @@ fn analyzeTupleCat(...@@ -8239,7 +8239,7 @@ fn analyzeTupleCat(
8239 });8239 });
82408240
8241 const runtime_src = opt_runtime_src orelse {8241 const runtime_src = opt_runtime_src orelse {
8242 const tuple_val = try Value.Tag.@"struct".create(sema.arena, values);8242 const tuple_val = try Value.Tag.aggregate.create(sema.arena, values);
8243 return sema.addConstant(tuple_ty, tuple_val);8243 return sema.addConstant(tuple_ty, tuple_val);
8244 };8244 };
82458245
...@@ -8334,7 +8334,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -8334,7 +8334,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
8334 .len = final_len,8334 .len = final_len,
8335 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),8335 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
8336 });8336 });
8337 const val = try Value.Tag.array.create(anon_decl.arena(), buf);8337 const val = try Value.Tag.aggregate.create(anon_decl.arena(), buf);
8338 const decl = try anon_decl.finish(ty, val);8338 const decl = try anon_decl.finish(ty, val);
8339 if (lhs_single_ptr or rhs_single_ptr) {8339 if (lhs_single_ptr or rhs_single_ptr) {
8340 return sema.analyzeDeclRef(decl);8340 return sema.analyzeDeclRef(decl);
...@@ -8419,7 +8419,7 @@ fn analyzeTupleMul(...@@ -8419,7 +8419,7 @@ fn analyzeTupleMul(
8419 });8419 });
84208420
8421 const runtime_src = opt_runtime_src orelse {8421 const runtime_src = opt_runtime_src orelse {
8422 const tuple_val = try Value.Tag.@"struct".create(sema.arena, values);8422 const tuple_val = try Value.Tag.aggregate.create(sema.arena, values);
8423 return sema.addConstant(tuple_ty, tuple_val);8423 return sema.addConstant(tuple_ty, tuple_val);
8424 };8424 };
84258425
...@@ -8506,7 +8506,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -8506,7 +8506,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
8506 if (mulinfo.sentinel) |sent| {8506 if (mulinfo.sentinel) |sent| {
8507 buf[final_len] = try sent.copy(anon_decl.arena());8507 buf[final_len] = try sent.copy(anon_decl.arena());
8508 }8508 }
8509 break :blk try Value.Tag.array.create(anon_decl.arena(), buf);8509 break :blk try Value.Tag.aggregate.create(anon_decl.arena(), buf);
8510 };8510 };
8511 const decl = try anon_decl.finish(final_ty, val);8511 const decl = try anon_decl.finish(final_ty, val);
8512 if (is_single_ptr) {8512 if (is_single_ptr) {
...@@ -10186,7 +10186,7 @@ fn zirBuiltinSrc(...@@ -10186,7 +10186,7 @@ fn zirBuiltinSrc(
1018610186
10187 return sema.addConstant(10187 return sema.addConstant(
10188 try sema.getBuiltinType(block, src, "SourceLocation"),10188 try sema.getBuiltinType(block, src, "SourceLocation"),
10189 try Value.Tag.@"struct".create(sema.arena, field_values),10189 try Value.Tag.aggregate.create(sema.arena, field_values),
10190 );10190 );
10191}10191}
1019210192
...@@ -10289,7 +10289,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10289,7 +10289,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10289 // arg_type: ?type,10289 // arg_type: ?type,
10290 param_ty_val,10290 param_ty_val,
10291 };10291 };
10292 param_val.* = try Value.Tag.@"struct".create(params_anon_decl.arena(), param_fields);10292 param_val.* = try Value.Tag.aggregate.create(params_anon_decl.arena(), param_fields);
10293 }10293 }
1029410294
10295 const args_val = v: {10295 const args_val = v: {
...@@ -10314,7 +10314,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10314,7 +10314,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10314 .len = param_vals.len,10314 .len = param_vals.len,
10315 .elem_type = param_info_decl.ty,10315 .elem_type = param_info_decl.ty,
10316 }),10316 }),
10317 try Value.Tag.array.create(10317 try Value.Tag.aggregate.create(
10318 params_anon_decl.arena(),10318 params_anon_decl.arena(),
10319 param_vals,10319 param_vals,
10320 ),10320 ),
...@@ -10345,7 +10345,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10345,7 +10345,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10345 type_info_ty,10345 type_info_ty,
10346 try Value.Tag.@"union".create(sema.arena, .{10346 try Value.Tag.@"union".create(sema.arena, .{
10347 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Fn)),10347 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Fn)),
10348 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10348 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10349 }),10349 }),
10350 );10350 );
10351 },10351 },
...@@ -10364,7 +10364,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10364,7 +10364,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10364 type_info_ty,10364 type_info_ty,
10365 try Value.Tag.@"union".create(sema.arena, .{10365 try Value.Tag.@"union".create(sema.arena, .{
10366 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Int)),10366 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Int)),
10367 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10367 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10368 }),10368 }),
10369 );10369 );
10370 },10370 },
...@@ -10377,7 +10377,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10377,7 +10377,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10377 type_info_ty,10377 type_info_ty,
10378 try Value.Tag.@"union".create(sema.arena, .{10378 try Value.Tag.@"union".create(sema.arena, .{
10379 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Float)),10379 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Float)),
10380 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10380 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10381 }),10381 }),
10382 );10382 );
10383 },10383 },
...@@ -10412,7 +10412,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10412,7 +10412,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10412 type_info_ty,10412 type_info_ty,
10413 try Value.Tag.@"union".create(sema.arena, .{10413 try Value.Tag.@"union".create(sema.arena, .{
10414 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Pointer)),10414 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Pointer)),
10415 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10415 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10416 }),10416 }),
10417 );10417 );
10418 },10418 },
...@@ -10430,7 +10430,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10430,7 +10430,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10430 type_info_ty,10430 type_info_ty,
10431 try Value.Tag.@"union".create(sema.arena, .{10431 try Value.Tag.@"union".create(sema.arena, .{
10432 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Array)),10432 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Array)),
10433 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10433 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10434 }),10434 }),
10435 );10435 );
10436 },10436 },
...@@ -10446,7 +10446,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10446,7 +10446,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10446 type_info_ty,10446 type_info_ty,
10447 try Value.Tag.@"union".create(sema.arena, .{10447 try Value.Tag.@"union".create(sema.arena, .{
10448 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Vector)),10448 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Vector)),
10449 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10449 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10450 }),10450 }),
10451 );10451 );
10452 },10452 },
...@@ -10459,7 +10459,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10459,7 +10459,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10459 type_info_ty,10459 type_info_ty,
10460 try Value.Tag.@"union".create(sema.arena, .{10460 try Value.Tag.@"union".create(sema.arena, .{
10461 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Optional)),10461 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Optional)),
10462 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10462 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10463 }),10463 }),
10464 );10464 );
10465 },10465 },
...@@ -10509,7 +10509,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10509,7 +10509,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10509 name_val,10509 name_val,
10510 };10510 };
1051110511
10512 field_val.* = try Value.Tag.@"struct".create(10512 field_val.* = try Value.Tag.aggregate.create(
10513 fields_anon_decl.arena(),10513 fields_anon_decl.arena(),
10514 error_field_fields,10514 error_field_fields,
10515 );10515 );
...@@ -10525,7 +10525,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10525,7 +10525,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10525 .len = vals.len,10525 .len = vals.len,
10526 .elem_type = error_field_ty,10526 .elem_type = error_field_ty,
10527 }),10527 }),
10528 try Value.Tag.array.create(10528 try Value.Tag.aggregate.create(
10529 fields_anon_decl.arena(),10529 fields_anon_decl.arena(),
10530 vals,10530 vals,
10531 ),10531 ),
...@@ -10559,7 +10559,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10559,7 +10559,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10559 type_info_ty,10559 type_info_ty,
10560 try Value.Tag.@"union".create(sema.arena, .{10560 try Value.Tag.@"union".create(sema.arena, .{
10561 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ErrorUnion)),10561 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ErrorUnion)),
10562 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10562 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10563 }),10563 }),
10564 );10564 );
10565 },10565 },
...@@ -10618,7 +10618,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10618,7 +10618,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10618 // value: comptime_int,10618 // value: comptime_int,
10619 int_val,10619 int_val,
10620 };10620 };
10621 field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), enum_field_fields);10621 field_val.* = try Value.Tag.aggregate.create(fields_anon_decl.arena(), enum_field_fields);
10622 }10622 }
1062310623
10624 const fields_val = v: {10624 const fields_val = v: {
...@@ -10627,7 +10627,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10627,7 +10627,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10627 .len = enum_field_vals.len,10627 .len = enum_field_vals.len,
10628 .elem_type = enum_field_ty,10628 .elem_type = enum_field_ty,
10629 }),10629 }),
10630 try Value.Tag.array.create(10630 try Value.Tag.aggregate.create(
10631 fields_anon_decl.arena(),10631 fields_anon_decl.arena(),
10632 enum_field_vals,10632 enum_field_vals,
10633 ),10633 ),
...@@ -10659,7 +10659,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10659,7 +10659,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10659 type_info_ty,10659 type_info_ty,
10660 try Value.Tag.@"union".create(sema.arena, .{10660 try Value.Tag.@"union".create(sema.arena, .{
10661 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Enum)),10661 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Enum)),
10662 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10662 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10663 }),10663 }),
10664 );10664 );
10665 },10665 },
...@@ -10717,7 +10717,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10717,7 +10717,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10717 // alignment: comptime_int,10717 // alignment: comptime_int,
10718 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),10718 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
10719 };10719 };
10720 field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), union_field_fields);10720 field_val.* = try Value.Tag.aggregate.create(fields_anon_decl.arena(), union_field_fields);
10721 }10721 }
1072210722
10723 const fields_val = v: {10723 const fields_val = v: {
...@@ -10726,7 +10726,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10726,7 +10726,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10726 .len = union_field_vals.len,10726 .len = union_field_vals.len,
10727 .elem_type = union_field_ty,10727 .elem_type = union_field_ty,
10728 }),10728 }),
10729 try Value.Tag.array.create(10729 try Value.Tag.aggregate.create(
10730 fields_anon_decl.arena(),10730 fields_anon_decl.arena(),
10731 try fields_anon_decl.arena().dupe(Value, union_field_vals),10731 try fields_anon_decl.arena().dupe(Value, union_field_vals),
10732 ),10732 ),
...@@ -10761,7 +10761,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10761,7 +10761,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10761 type_info_ty,10761 type_info_ty,
10762 try Value.Tag.@"union".create(sema.arena, .{10762 try Value.Tag.@"union".create(sema.arena, .{
10763 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Union)),10763 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Union)),
10764 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10764 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10765 }),10765 }),
10766 );10766 );
10767 },10767 },
...@@ -10827,7 +10827,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10827,7 +10827,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10827 // alignment: comptime_int,10827 // alignment: comptime_int,
10828 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),10828 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
10829 };10829 };
10830 struct_field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), struct_field_fields);10830 struct_field_val.* = try Value.Tag.aggregate.create(fields_anon_decl.arena(), struct_field_fields);
10831 }10831 }
10832 break :fv struct_field_vals;10832 break :fv struct_field_vals;
10833 }10833 }
...@@ -10871,7 +10871,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10871,7 +10871,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10871 // alignment: comptime_int,10871 // alignment: comptime_int,
10872 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),10872 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
10873 };10873 };
10874 field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), struct_field_fields);10874 field_val.* = try Value.Tag.aggregate.create(fields_anon_decl.arena(), struct_field_fields);
10875 }10875 }
10876 break :fv struct_field_vals;10876 break :fv struct_field_vals;
10877 };10877 };
...@@ -10882,7 +10882,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10882,7 +10882,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10882 .len = struct_field_vals.len,10882 .len = struct_field_vals.len,
10883 .elem_type = struct_field_ty,10883 .elem_type = struct_field_ty,
10884 }),10884 }),
10885 try Value.Tag.array.create(10885 try Value.Tag.aggregate.create(
10886 fields_anon_decl.arena(),10886 fields_anon_decl.arena(),
10887 try fields_anon_decl.arena().dupe(Value, struct_field_vals),10887 try fields_anon_decl.arena().dupe(Value, struct_field_vals),
10888 ),10888 ),
...@@ -10911,7 +10911,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10911,7 +10911,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10911 type_info_ty,10911 type_info_ty,
10912 try Value.Tag.@"union".create(sema.arena, .{10912 try Value.Tag.@"union".create(sema.arena, .{
10913 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Struct)),10913 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Struct)),
10914 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10914 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10915 }),10915 }),
10916 );10916 );
10917 },10917 },
...@@ -10931,7 +10931,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -10931,7 +10931,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
10931 type_info_ty,10931 type_info_ty,
10932 try Value.Tag.@"union".create(sema.arena, .{10932 try Value.Tag.@"union".create(sema.arena, .{
10933 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Opaque)),10933 .tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Opaque)),
10934 .val = try Value.Tag.@"struct".create(sema.arena, field_values),10934 .val = try Value.Tag.aggregate.create(sema.arena, field_values),
10935 }),10935 }),
10936 );10936 );
10937 },10937 },
...@@ -10987,7 +10987,7 @@ fn typeInfoDecls(...@@ -10987,7 +10987,7 @@ fn typeInfoDecls(
10987 //is_pub: bool,10987 //is_pub: bool,
10988 Value.makeBool(decl.is_pub),10988 Value.makeBool(decl.is_pub),
10989 };10989 };
10990 decls_val.* = try Value.Tag.@"struct".create(decls_anon_decl.arena(), fields);10990 decls_val.* = try Value.Tag.aggregate.create(decls_anon_decl.arena(), fields);
10991 }10991 }
1099210992
10993 const new_decl = try decls_anon_decl.finish(10993 const new_decl = try decls_anon_decl.finish(
...@@ -10995,7 +10995,7 @@ fn typeInfoDecls(...@@ -10995,7 +10995,7 @@ fn typeInfoDecls(
10995 .len = decls_vals.len,10995 .len = decls_vals.len,
10996 .elem_type = declaration_ty,10996 .elem_type = declaration_ty,
10997 }),10997 }),
10998 try Value.Tag.array.create(10998 try Value.Tag.aggregate.create(
10999 decls_anon_decl.arena(),10999 decls_anon_decl.arena(),
11000 try decls_anon_decl.arena().dupe(Value, decls_vals),11000 try decls_anon_decl.arena().dupe(Value, decls_vals),
11001 ),11001 ),
...@@ -11816,7 +11816,7 @@ fn finishStructInit(...@@ -11816,7 +11816,7 @@ fn finishStructInit(
11816 for (field_inits) |field_init, i| {11816 for (field_inits) |field_init, i| {
11817 values[i] = (sema.resolveMaybeUndefVal(block, src, field_init) catch unreachable).?;11817 values[i] = (sema.resolveMaybeUndefVal(block, src, field_init) catch unreachable).?;
11818 }11818 }
11819 const struct_val = try Value.Tag.@"struct".create(sema.arena, values);11819 const struct_val = try Value.Tag.aggregate.create(sema.arena, values);
11820 return sema.addConstantMaybeRef(block, src, struct_ty, struct_val, is_ref);11820 return sema.addConstantMaybeRef(block, src, struct_ty, struct_val, is_ref);
11821 }11821 }
1182211822
...@@ -11877,7 +11877,7 @@ fn zirStructInitAnon(...@@ -11877,7 +11877,7 @@ fn zirStructInitAnon(
11877 });11877 });
1187811878
11879 const runtime_src = opt_runtime_src orelse {11879 const runtime_src = opt_runtime_src orelse {
11880 const tuple_val = try Value.Tag.@"struct".create(sema.arena, values);11880 const tuple_val = try Value.Tag.aggregate.create(sema.arena, values);
11881 return sema.addConstantMaybeRef(block, src, tuple_ty, tuple_val, is_ref);11881 return sema.addConstantMaybeRef(block, src, tuple_ty, tuple_val, is_ref);
11882 };11882 };
1188311883
...@@ -11974,7 +11974,7 @@ fn zirArrayInit(...@@ -11974,7 +11974,7 @@ fn zirArrayInit(
11974 elem_vals[i] = (sema.resolveMaybeUndefVal(block, src, arg) catch unreachable).?;11974 elem_vals[i] = (sema.resolveMaybeUndefVal(block, src, arg) catch unreachable).?;
11975 }11975 }
1197611976
11977 const array_val = try Value.Tag.array.create(sema.arena, elem_vals);11977 const array_val = try Value.Tag.aggregate.create(sema.arena, elem_vals);
11978 return sema.addConstantMaybeRef(block, src, array_ty, array_val, is_ref);11978 return sema.addConstantMaybeRef(block, src, array_ty, array_val, is_ref);
11979 };11979 };
1198011980
...@@ -12043,7 +12043,7 @@ fn zirArrayInitAnon(...@@ -12043,7 +12043,7 @@ fn zirArrayInitAnon(
12043 });12043 });
1204412044
12045 const runtime_src = opt_runtime_src orelse {12045 const runtime_src = opt_runtime_src orelse {
12046 const tuple_val = try Value.Tag.@"struct".create(sema.arena, values);12046 const tuple_val = try Value.Tag.aggregate.create(sema.arena, values);
12047 return sema.addConstantMaybeRef(block, src, tuple_ty, tuple_val, is_ref);12047 return sema.addConstantMaybeRef(block, src, tuple_ty, tuple_val, is_ref);
12048 };12048 };
1204912049
...@@ -12250,7 +12250,7 @@ fn zirUnaryMath(...@@ -12250,7 +12250,7 @@ fn zirUnaryMath(
12250 }12250 }
12251 return sema.addConstant(12251 return sema.addConstant(
12252 result_ty,12252 result_ty,
12253 try Value.Tag.array.create(sema.arena, elems),12253 try Value.Tag.aggregate.create(sema.arena, elems),
12254 );12254 );
12255 }12255 }
1225612256
...@@ -12350,7 +12350,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12350,7 +12350,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12350 .AnyFrame => return Air.Inst.Ref.anyframe_type,12350 .AnyFrame => return Air.Inst.Ref.anyframe_type,
12351 .EnumLiteral => return Air.Inst.Ref.enum_literal_type,12351 .EnumLiteral => return Air.Inst.Ref.enum_literal_type,
12352 .Int => {12352 .Int => {
12353 const struct_val = union_val.val.castTag(.@"struct").?.data;12353 const struct_val = union_val.val.castTag(.aggregate).?.data;
12354 // TODO use reflection instead of magic numbers here12354 // TODO use reflection instead of magic numbers here
12355 const signedness_val = struct_val[0];12355 const signedness_val = struct_val[0];
12356 const bits_val = struct_val[1];12356 const bits_val = struct_val[1];
...@@ -12364,7 +12364,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12364,7 +12364,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12364 return sema.addType(ty);12364 return sema.addType(ty);
12365 },12365 },
12366 .Vector => {12366 .Vector => {
12367 const struct_val = union_val.val.castTag(.@"struct").?.data;12367 const struct_val = union_val.val.castTag(.aggregate).?.data;
12368 // TODO use reflection instead of magic numbers here12368 // TODO use reflection instead of magic numbers here
12369 const len_val = struct_val[0];12369 const len_val = struct_val[0];
12370 const child_val = struct_val[1];12370 const child_val = struct_val[1];
...@@ -12377,7 +12377,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12377,7 +12377,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12377 return sema.addType(ty);12377 return sema.addType(ty);
12378 },12378 },
12379 .Float => {12379 .Float => {
12380 const struct_val = union_val.val.castTag(.@"struct").?.data;12380 const struct_val = union_val.val.castTag(.aggregate).?.data;
12381 // TODO use reflection instead of magic numbers here12381 // TODO use reflection instead of magic numbers here
12382 // bits: comptime_int,12382 // bits: comptime_int,
12383 const bits_val = struct_val[0];12383 const bits_val = struct_val[0];
...@@ -12394,7 +12394,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12394,7 +12394,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12394 return sema.addType(ty);12394 return sema.addType(ty);
12395 },12395 },
12396 .Pointer => {12396 .Pointer => {
12397 const struct_val = union_val.val.castTag(.@"struct").?.data;12397 const struct_val = union_val.val.castTag(.aggregate).?.data;
12398 // TODO use reflection instead of magic numbers here12398 // TODO use reflection instead of magic numbers here
12399 const size_val = struct_val[0];12399 const size_val = struct_val[0];
12400 const is_const_val = struct_val[1];12400 const is_const_val = struct_val[1];
...@@ -12436,7 +12436,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12436,7 +12436,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12436 return sema.addType(ty);12436 return sema.addType(ty);
12437 },12437 },
12438 .Array => {12438 .Array => {
12439 const struct_val = union_val.val.castTag(.@"struct").?.data;12439 const struct_val = union_val.val.castTag(.aggregate).?.data;
12440 // TODO use reflection instead of magic numbers here12440 // TODO use reflection instead of magic numbers here
12441 // len: comptime_int,12441 // len: comptime_int,
12442 const len_val = struct_val[0];12442 const len_val = struct_val[0];
...@@ -12460,7 +12460,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12460,7 +12460,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12460 return sema.addType(ty);12460 return sema.addType(ty);
12461 },12461 },
12462 .Optional => {12462 .Optional => {
12463 const struct_val = union_val.val.castTag(.@"struct").?.data;12463 const struct_val = union_val.val.castTag(.aggregate).?.data;
12464 // TODO use reflection instead of magic numbers here12464 // TODO use reflection instead of magic numbers here
12465 // child: type,12465 // child: type,
12466 const child_val = struct_val[0];12466 const child_val = struct_val[0];
...@@ -12472,7 +12472,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12472,7 +12472,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12472 return sema.addType(ty);12472 return sema.addType(ty);
12473 },12473 },
12474 .ErrorUnion => {12474 .ErrorUnion => {
12475 const struct_val = union_val.val.castTag(.@"struct").?.data;12475 const struct_val = union_val.val.castTag(.aggregate).?.data;
12476 // TODO use reflection instead of magic numbers here12476 // TODO use reflection instead of magic numbers here
12477 // error_set: type,12477 // error_set: type,
12478 const error_set_val = struct_val[0];12478 const error_set_val = struct_val[0];
...@@ -12495,12 +12495,12 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12495,12 +12495,12 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12495 const slice_val = payload_val.castTag(.slice).?.data;12495 const slice_val = payload_val.castTag(.slice).?.data;
12496 const decl = slice_val.ptr.pointerDecl().?;12496 const decl = slice_val.ptr.pointerDecl().?;
12497 try sema.ensureDeclAnalyzed(decl);12497 try sema.ensureDeclAnalyzed(decl);
12498 const array_val = decl.val.castTag(.array).?.data;12498 const array_val = decl.val.castTag(.aggregate).?.data;
1249912499
12500 var names: Module.ErrorSet.NameMap = .{};12500 var names: Module.ErrorSet.NameMap = .{};
12501 try names.ensureUnusedCapacity(sema.arena, array_val.len);12501 try names.ensureUnusedCapacity(sema.arena, array_val.len);
12502 for (array_val) |elem_val| {12502 for (array_val) |elem_val| {
12503 const struct_val = elem_val.castTag(.@"struct").?.data;12503 const struct_val = elem_val.castTag(.aggregate).?.data;
12504 // TODO use reflection instead of magic numbers here12504 // TODO use reflection instead of magic numbers here
12505 // error_set: type,12505 // error_set: type,
12506 const name_val = struct_val[0];12506 const name_val = struct_val[0];
...@@ -12516,7 +12516,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12516,7 +12516,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12516 },12516 },
12517 .Struct => {12517 .Struct => {
12518 // TODO use reflection instead of magic numbers here12518 // TODO use reflection instead of magic numbers here
12519 const struct_val = union_val.val.castTag(.@"struct").?.data;12519 const struct_val = union_val.val.castTag(.aggregate).?.data;
12520 // layout: containerlayout,12520 // layout: containerlayout,
12521 const layout_val = struct_val[0];12521 const layout_val = struct_val[0];
12522 // fields: []const enumfield,12522 // fields: []const enumfield,
...@@ -12537,7 +12537,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12537,7 +12537,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12537 try sema.reifyStruct(block, inst, src, layout_val, fields_val);12537 try sema.reifyStruct(block, inst, src, layout_val, fields_val);
12538 },12538 },
12539 .Enum => {12539 .Enum => {
12540 const struct_val = union_val.val.castTag(.@"struct").?.data;12540 const struct_val = union_val.val.castTag(.aggregate).?.data;
12541 // TODO use reflection instead of magic numbers here12541 // TODO use reflection instead of magic numbers here
12542 // layout: ContainerLayout,12542 // layout: ContainerLayout,
12543 const layout_val = struct_val[0];12543 const layout_val = struct_val[0];
...@@ -12617,9 +12617,9 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12617,9 +12617,9 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12617 .ty = enum_obj.tag_ty,12617 .ty = enum_obj.tag_ty,
12618 });12618 });
1261912619
12620 const array_vals = decl.val.castTag(.array).?.data;12620 const array_vals = decl.val.castTag(.aggregate).?.data;
12621 for (array_vals) |elem_val| {12621 for (array_vals) |elem_val| {
12622 const field_struct_val = elem_val.castTag(.@"struct").?.data;12622 const field_struct_val = elem_val.castTag(.aggregate).?.data;
12623 // TODO use reflection instead of magic numbers here12623 // TODO use reflection instead of magic numbers here
12624 // name: []const u812624 // name: []const u8
12625 const name_val = field_struct_val[0];12625 const name_val = field_struct_val[0];
...@@ -12648,7 +12648,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12648,7 +12648,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12648 return sema.analyzeDeclVal(block, src, new_decl);12648 return sema.analyzeDeclVal(block, src, new_decl);
12649 },12649 },
12650 .Opaque => {12650 .Opaque => {
12651 const struct_val = union_val.val.castTag(.@"struct").?.data;12651 const struct_val = union_val.val.castTag(.aggregate).?.data;
12652 // decls: []const Declaration,12652 // decls: []const Declaration,
12653 const decls_val = struct_val[0];12653 const decls_val = struct_val[0];
1265412654
...@@ -12694,7 +12694,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -12694,7 +12694,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
12694 .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}),12694 .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}),
12695 .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}),12695 .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}),
12696 .BoundFn => @panic("TODO delete BoundFn from the language"),12696 .BoundFn => @panic("TODO delete BoundFn from the language"),
12697 .Frame => return sema.fail(block, src, "TODO: Sema.zirReify for Frame", .{}),12697 .Frame => @panic("TODO implement https://github.com/ziglang/zig/issues/10710"),
12698 }12698 }
12699}12699}
1270012700
...@@ -12717,7 +12717,7 @@ fn reifyTuple(...@@ -12717,7 +12717,7 @@ fn reifyTuple(
12717 var i: usize = 0;12717 var i: usize = 0;
12718 while (i < fields_len) : (i += 1) {12718 while (i < fields_len) : (i += 1) {
12719 const elem_val = try fields_val.elemValue(sema.arena, i);12719 const elem_val = try fields_val.elemValue(sema.arena, i);
12720 const field_struct_val = elem_val.castTag(.@"struct").?.data;12720 const field_struct_val = elem_val.castTag(.aggregate).?.data;
12721 // TODO use reflection instead of magic numbers here12721 // TODO use reflection instead of magic numbers here
12722 // name: []const u812722 // name: []const u8
12723 const name_val = field_struct_val[0];12723 const name_val = field_struct_val[0];
...@@ -12818,7 +12818,7 @@ fn reifyStruct(...@@ -12818,7 +12818,7 @@ fn reifyStruct(
12818 var i: usize = 0;12818 var i: usize = 0;
12819 while (i < fields_len) : (i += 1) {12819 while (i < fields_len) : (i += 1) {
12820 const elem_val = try fields_val.elemValue(sema.arena, i);12820 const elem_val = try fields_val.elemValue(sema.arena, i);
12821 const field_struct_val = elem_val.castTag(.@"struct").?.data;12821 const field_struct_val = elem_val.castTag(.aggregate).?.data;
12822 // TODO use reflection instead of magic numbers here12822 // TODO use reflection instead of magic numbers here
12823 // name: []const u812823 // name: []const u8
12824 const name_val = field_struct_val[0];12824 const name_val = field_struct_val[0];
...@@ -13219,7 +13219,7 @@ fn zirBitCount(...@@ -13219,7 +13219,7 @@ fn zirBitCount(
13219 }13219 }
13220 return sema.addConstant(13220 return sema.addConstant(
13221 result_ty,13221 result_ty,
13222 try Value.Tag.array.create(sema.arena, elems),13222 try Value.Tag.aggregate.create(sema.arena, elems),
13223 );13223 );
13224 } else {13224 } else {
13225 try sema.requireRuntimeBlock(block, operand_src);13225 try sema.requireRuntimeBlock(block, operand_src);
...@@ -13985,7 +13985,7 @@ fn analyzeShuffle(...@@ -13985,7 +13985,7 @@ fn analyzeShuffle(
13985 values[i] = try b_val.elemValue(sema.arena, unsigned);13985 values[i] = try b_val.elemValue(sema.arena, unsigned);
13986 }13986 }
13987 }13987 }
13988 const res_val = try Value.Tag.array.create(sema.arena, values);13988 const res_val = try Value.Tag.aggregate.create(sema.arena, values);
13989 return sema.addConstant(res_ty, res_val);13989 return sema.addConstant(res_ty, res_val);
13990 }13990 }
13991 }13991 }
...@@ -14008,7 +14008,7 @@ fn analyzeShuffle(...@@ -14008,7 +14008,7 @@ fn analyzeShuffle(
14008 while (i < max_len) : (i += 1) {14008 while (i < max_len) : (i += 1) {
14009 expand_mask_values[i] = Value.negative_one;14009 expand_mask_values[i] = Value.negative_one;
14010 }14010 }
14011 const expand_mask = try Value.Tag.array.create(sema.arena, expand_mask_values);14011 const expand_mask = try Value.Tag.aggregate.create(sema.arena, expand_mask_values);
1401214012
14013 if (a_len < b_len) {14013 if (a_len < b_len) {
14014 const undef = try sema.addConstUndef(a_ty);14014 const undef = try sema.addConstUndef(a_ty);
...@@ -14454,7 +14454,7 @@ fn zirMinMax(...@@ -14454,7 +14454,7 @@ fn zirMinMax(
14454 }14454 }
14455 return sema.addConstant(14455 return sema.addConstant(
14456 simd_op.result_ty,14456 simd_op.result_ty,
14457 try Value.Tag.array.create(sema.arena, elems),14457 try Value.Tag.aggregate.create(sema.arena, elems),
14458 );14458 );
14459 } else rs: {14459 } else rs: {
14460 if (simd_op.rhs_val) |rhs_val| {14460 if (simd_op.rhs_val) |rhs_val| {
...@@ -16016,7 +16016,7 @@ fn structFieldVal(...@@ -16016,7 +16016,7 @@ fn structFieldVal(
16016 return sema.addConstant(field.ty, opv);16016 return sema.addConstant(field.ty, opv);
16017 }16017 }
1601816018
16019 const field_values = struct_val.castTag(.@"struct").?.data;16019 const field_values = struct_val.castTag(.aggregate).?.data;
16020 return sema.addConstant(field.ty, field_values[field_index]);16020 return sema.addConstant(field.ty, field_values[field_index]);
16021 }16021 }
1602216022
...@@ -16084,7 +16084,7 @@ fn tupleFieldValByIndex(...@@ -16084,7 +16084,7 @@ fn tupleFieldValByIndex(
16084 if ((try sema.typeHasOnePossibleValue(block, src, field_ty))) |opv| {16084 if ((try sema.typeHasOnePossibleValue(block, src, field_ty))) |opv| {
16085 return sema.addConstant(field_ty, opv);16085 return sema.addConstant(field_ty, opv);
16086 }16086 }
16087 const field_values = tuple_val.castTag(.@"struct").?.data;16087 const field_values = tuple_val.castTag(.aggregate).?.data;
16088 return sema.addConstant(field_ty, field_values[field_index]);16088 return sema.addConstant(field_ty, field_values[field_index]);
16089 }16089 }
1609016090
...@@ -16414,7 +16414,7 @@ fn tupleField(...@@ -16414,7 +16414,7 @@ fn tupleField(
1641416414
16415 if (try sema.resolveMaybeUndefVal(block, tuple_src, tuple)) |tuple_val| {16415 if (try sema.resolveMaybeUndefVal(block, tuple_src, tuple)) |tuple_val| {
16416 if (tuple_val.isUndef()) return sema.addConstUndef(field_ty);16416 if (tuple_val.isUndef()) return sema.addConstUndef(field_ty);
16417 const field_values = tuple_val.castTag(.@"struct").?.data;16417 const field_values = tuple_val.castTag(.aggregate).?.data;
16418 return sema.addConstant(field_ty, field_values[field_index]);16418 return sema.addConstant(field_ty, field_values[field_index]);
16419 }16419 }
1642016420
...@@ -17510,7 +17510,7 @@ fn beginComptimePtrMutation(...@@ -17510,7 +17510,7 @@ fn beginComptimePtrMutation(
17510 const elems = try arena.alloc(Value, array_len_including_sentinel);17510 const elems = try arena.alloc(Value, array_len_including_sentinel);
17511 mem.set(Value, elems, Value.undef);17511 mem.set(Value, elems, Value.undef);
1751217512
17513 parent.val.* = try Value.Tag.array.create(arena, elems);17513 parent.val.* = try Value.Tag.aggregate.create(arena, elems);
1751417514
17515 return ComptimePtrMutationKit{17515 return ComptimePtrMutationKit{
17516 .decl_ref_mut = parent.decl_ref_mut,17516 .decl_ref_mut = parent.decl_ref_mut,
...@@ -17537,7 +17537,7 @@ fn beginComptimePtrMutation(...@@ -17537,7 +17537,7 @@ fn beginComptimePtrMutation(
17537 elem.* = try Value.Tag.int_u64.create(arena, bytes[i]);17537 elem.* = try Value.Tag.int_u64.create(arena, bytes[i]);
17538 }17538 }
1753917539
17540 parent.val.* = try Value.Tag.array.create(arena, elems);17540 parent.val.* = try Value.Tag.aggregate.create(arena, elems);
1754117541
17542 return ComptimePtrMutationKit{17542 return ComptimePtrMutationKit{
17543 .decl_ref_mut = parent.decl_ref_mut,17543 .decl_ref_mut = parent.decl_ref_mut,
...@@ -17562,7 +17562,7 @@ fn beginComptimePtrMutation(...@@ -17562,7 +17562,7 @@ fn beginComptimePtrMutation(
17562 const elems = try arena.alloc(Value, array_len_including_sentinel);17562 const elems = try arena.alloc(Value, array_len_including_sentinel);
17563 mem.set(Value, elems, repeated_val);17563 mem.set(Value, elems, repeated_val);
1756417564
17565 parent.val.* = try Value.Tag.array.create(arena, elems);17565 parent.val.* = try Value.Tag.aggregate.create(arena, elems);
1756617566
17567 return ComptimePtrMutationKit{17567 return ComptimePtrMutationKit{
17568 .decl_ref_mut = parent.decl_ref_mut,17568 .decl_ref_mut = parent.decl_ref_mut,
...@@ -17571,9 +17571,9 @@ fn beginComptimePtrMutation(...@@ -17571,9 +17571,9 @@ fn beginComptimePtrMutation(
17571 };17571 };
17572 },17572 },
1757317573
17574 .array => return ComptimePtrMutationKit{17574 .aggregate => return ComptimePtrMutationKit{
17575 .decl_ref_mut = parent.decl_ref_mut,17575 .decl_ref_mut = parent.decl_ref_mut,
17576 .val = &parent.val.castTag(.array).?.data[elem_ptr.index],17576 .val = &parent.val.castTag(.aggregate).?.data[elem_ptr.index],
17577 .ty = elem_ty,17577 .ty = elem_ty,
17578 },17578 },
1757917579
...@@ -17613,7 +17613,7 @@ fn beginComptimePtrMutation(...@@ -17613,7 +17613,7 @@ fn beginComptimePtrMutation(
17613 const fields = try arena.alloc(Value, parent.ty.structFieldCount());17613 const fields = try arena.alloc(Value, parent.ty.structFieldCount());
17614 mem.set(Value, fields, Value.undef);17614 mem.set(Value, fields, Value.undef);
1761517615
17616 parent.val.* = try Value.Tag.@"struct".create(arena, fields);17616 parent.val.* = try Value.Tag.aggregate.create(arena, fields);
1761717617
17618 return ComptimePtrMutationKit{17618 return ComptimePtrMutationKit{
17619 .decl_ref_mut = parent.decl_ref_mut,17619 .decl_ref_mut = parent.decl_ref_mut,
...@@ -17639,9 +17639,9 @@ fn beginComptimePtrMutation(...@@ -17639,9 +17639,9 @@ fn beginComptimePtrMutation(
17639 else => unreachable,17639 else => unreachable,
17640 }17640 }
17641 },17641 },
17642 .@"struct" => return ComptimePtrMutationKit{17642 .aggregate => return ComptimePtrMutationKit{
17643 .decl_ref_mut = parent.decl_ref_mut,17643 .decl_ref_mut = parent.decl_ref_mut,
17644 .val = &parent.val.castTag(.@"struct").?.data[field_index],17644 .val = &parent.val.castTag(.aggregate).?.data[field_index],
17645 .ty = field_ty,17645 .ty = field_ty,
17646 },17646 },
17647 .@"union" => {17647 .@"union" => {
...@@ -18209,7 +18209,7 @@ fn coerceArrayLike(...@@ -18209,7 +18209,7 @@ fn coerceArrayLike(
1820918209
18210 return sema.addConstant(18210 return sema.addConstant(
18211 dest_ty,18211 dest_ty,
18212 try Value.Tag.array.create(sema.arena, element_vals),18212 try Value.Tag.aggregate.create(sema.arena, element_vals),
18213 );18213 );
18214}18214}
1821518215
...@@ -18266,7 +18266,7 @@ fn coerceTupleToArray(...@@ -18266,7 +18266,7 @@ fn coerceTupleToArray(
1826618266
18267 return sema.addConstant(18267 return sema.addConstant(
18268 dest_ty,18268 dest_ty,
18269 try Value.Tag.array.create(sema.arena, element_vals),18269 try Value.Tag.aggregate.create(sema.arena, element_vals),
18270 );18270 );
18271}18271}
1827218272
...@@ -18397,7 +18397,7 @@ fn coerceTupleToStruct(...@@ -18397,7 +18397,7 @@ fn coerceTupleToStruct(
1839718397
18398 return sema.addConstant(18398 return sema.addConstant(
18399 struct_ty,18399 struct_ty,
18400 try Value.Tag.@"struct".create(sema.arena, field_vals),18400 try Value.Tag.aggregate.create(sema.arena, field_vals),
18401 );18401 );
18402}18402}
1840318403
src/codegen.zig+3-3
...@@ -225,9 +225,9 @@ pub fn generateSymbol(...@@ -225,9 +225,9 @@ pub fn generateSymbol(
225 return Result{ .externally_managed = payload.data };225 return Result{ .externally_managed = payload.data };
226 }226 }
227 },227 },
228 .array => {228 .aggregate => {
229 // TODO populate .debug_info for the array229 // TODO populate .debug_info for the array
230 const elem_vals = typed_value.val.castTag(.array).?.data;230 const elem_vals = typed_value.val.castTag(.aggregate).?.data;
231 const elem_ty = typed_value.ty.elemType();231 const elem_ty = typed_value.ty.elemType();
232 for (elem_vals) |elem_val| {232 for (elem_vals) |elem_val| {
233 switch (try generateSymbol(bin_file, src_loc, .{233 switch (try generateSymbol(bin_file, src_loc, .{
...@@ -554,7 +554,7 @@ pub fn generateSymbol(...@@ -554,7 +554,7 @@ pub fn generateSymbol(
554 }554 }
555555
556 const struct_begin = code.items.len;556 const struct_begin = code.items.len;
557 const field_vals = typed_value.val.castTag(.@"struct").?.data;557 const field_vals = typed_value.val.castTag(.aggregate).?.data;
558 for (field_vals) |field_val, index| {558 for (field_vals) |field_val, index| {
559 const field_ty = typed_value.ty.structFieldType(index);559 const field_ty = typed_value.ty.structFieldType(index);
560 if (!field_ty.hasRuntimeBits()) continue;560 if (!field_ty.hasRuntimeBits()) continue;
src/codegen/c.zig+1-1
...@@ -748,7 +748,7 @@ pub const DeclGen = struct {...@@ -748,7 +748,7 @@ pub const DeclGen = struct {
748 else => unreachable,748 else => unreachable,
749 },749 },
750 .Struct => {750 .Struct => {
751 const field_vals = val.castTag(.@"struct").?.data;751 const field_vals = val.castTag(.aggregate).?.data;
752752
753 try writer.writeAll("(");753 try writer.writeAll("(");
754 try dg.renderTypecast(writer, ty);754 try dg.renderTypecast(writer, ty);
src/codegen/llvm.zig+72-7
...@@ -1511,8 +1511,8 @@ pub const DeclGen = struct {...@@ -1511,8 +1511,8 @@ pub const DeclGen = struct {
1511 .True, // don't null terminate. bytes has the sentinel, if any.1511 .True, // don't null terminate. bytes has the sentinel, if any.
1512 );1512 );
1513 },1513 },
1514 .array => {1514 .aggregate => {
1515 const elem_vals = tv.val.castTag(.array).?.data;1515 const elem_vals = tv.val.castTag(.aggregate).?.data;
1516 const elem_ty = tv.ty.elemType();1516 const elem_ty = tv.ty.elemType();
1517 const gpa = dg.gpa;1517 const gpa = dg.gpa;
1518 const llvm_elems = try gpa.alloc(*const llvm.Value, elem_vals.len);1518 const llvm_elems = try gpa.alloc(*const llvm.Value, elem_vals.len);
...@@ -1665,11 +1665,76 @@ pub const DeclGen = struct {...@@ -1665,11 +1665,76 @@ pub const DeclGen = struct {
1665 },1665 },
1666 .Struct => {1666 .Struct => {
1667 const llvm_struct_ty = try dg.llvmType(tv.ty);1667 const llvm_struct_ty = try dg.llvmType(tv.ty);
1668 const field_vals = tv.val.castTag(.@"struct").?.data;1668 const field_vals = tv.val.castTag(.aggregate).?.data;
1669 const gpa = dg.gpa;1669 const gpa = dg.gpa;
1670 const struct_obj = tv.ty.castTag(.@"struct").?.data;
1671 const target = dg.module.getTarget();1670 const target = dg.module.getTarget();
16721671
1672 if (tv.ty.isTupleOrAnonStruct()) {
1673 const tuple = tv.ty.tupleFields();
1674 var llvm_fields: std.ArrayListUnmanaged(*const llvm.Value) = .{};
1675 defer llvm_fields.deinit(gpa);
1676
1677 try llvm_fields.ensureUnusedCapacity(gpa, tuple.types.len);
1678
1679 comptime assert(struct_layout_version == 2);
1680 var offset: u64 = 0;
1681 var big_align: u32 = 0;
1682 var need_unnamed = false;
1683
1684 for (tuple.types) |field_ty, i| {
1685 if (tuple.values[i].tag() != .unreachable_value) continue;
1686 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
1687
1688 const field_align = field_ty.abiAlignment(target);
1689 big_align = @maximum(big_align, field_align);
1690 const prev_offset = offset;
1691 offset = std.mem.alignForwardGeneric(u64, offset, field_align);
1692
1693 const padding_len = offset - prev_offset;
1694 if (padding_len > 0) {
1695 const llvm_array_ty = dg.context.intType(8).arrayType(@intCast(c_uint, padding_len));
1696 // TODO make this and all other padding elsewhere in debug
1697 // builds be 0xaa not undef.
1698 llvm_fields.appendAssumeCapacity(llvm_array_ty.getUndef());
1699 }
1700
1701 const field_llvm_val = try dg.genTypedValue(.{
1702 .ty = field_ty,
1703 .val = field_vals[i],
1704 });
1705
1706 need_unnamed = need_unnamed or dg.isUnnamedType(field_ty, field_llvm_val);
1707
1708 llvm_fields.appendAssumeCapacity(field_llvm_val);
1709
1710 offset += field_ty.abiSize(target);
1711 }
1712 {
1713 const prev_offset = offset;
1714 offset = std.mem.alignForwardGeneric(u64, offset, big_align);
1715 const padding_len = offset - prev_offset;
1716 if (padding_len > 0) {
1717 const llvm_array_ty = dg.context.intType(8).arrayType(@intCast(c_uint, padding_len));
1718 llvm_fields.appendAssumeCapacity(llvm_array_ty.getUndef());
1719 }
1720 }
1721
1722 if (need_unnamed) {
1723 return dg.context.constStruct(
1724 llvm_fields.items.ptr,
1725 @intCast(c_uint, llvm_fields.items.len),
1726 .False,
1727 );
1728 } else {
1729 return llvm_struct_ty.constNamedStruct(
1730 llvm_fields.items.ptr,
1731 @intCast(c_uint, llvm_fields.items.len),
1732 );
1733 }
1734 }
1735
1736 const struct_obj = tv.ty.castTag(.@"struct").?.data;
1737
1673 if (struct_obj.layout == .Packed) {1738 if (struct_obj.layout == .Packed) {
1674 const big_bits = struct_obj.packedIntegerBits(target);1739 const big_bits = struct_obj.packedIntegerBits(target);
1675 const int_llvm_ty = dg.context.intType(big_bits);1740 const int_llvm_ty = dg.context.intType(big_bits);
...@@ -1707,8 +1772,8 @@ pub const DeclGen = struct {...@@ -1707,8 +1772,8 @@ pub const DeclGen = struct {
1707 comptime assert(struct_layout_version == 2);1772 comptime assert(struct_layout_version == 2);
1708 var offset: u64 = 0;1773 var offset: u64 = 0;
1709 var big_align: u32 = 0;1774 var big_align: u32 = 0;
1710
1711 var need_unnamed = false;1775 var need_unnamed = false;
1776
1712 for (struct_obj.fields.values()) |field, i| {1777 for (struct_obj.fields.values()) |field, i| {
1713 if (field.is_comptime or !field.ty.hasRuntimeBitsIgnoreComptime()) continue;1778 if (field.is_comptime or !field.ty.hasRuntimeBitsIgnoreComptime()) continue;
17141779
...@@ -1854,10 +1919,10 @@ pub const DeclGen = struct {...@@ -1854,10 +1919,10 @@ pub const DeclGen = struct {
1854 @intCast(c_uint, llvm_elems.len),1919 @intCast(c_uint, llvm_elems.len),
1855 );1920 );
1856 },1921 },
1857 .array => {1922 .aggregate => {
1858 // Note, sentinel is not stored even if the type has a sentinel.1923 // Note, sentinel is not stored even if the type has a sentinel.
1859 // The value includes the sentinel in those cases.1924 // The value includes the sentinel in those cases.
1860 const elem_vals = tv.val.castTag(.array).?.data;1925 const elem_vals = tv.val.castTag(.aggregate).?.data;
1861 const vector_len = @intCast(usize, tv.ty.arrayLen());1926 const vector_len = @intCast(usize, tv.ty.arrayLen());
1862 assert(vector_len == elem_vals.len or vector_len + 1 == elem_vals.len);1927 assert(vector_len == elem_vals.len or vector_len + 1 == elem_vals.len);
1863 const elem_ty = tv.ty.elemType();1928 const elem_ty = tv.ty.elemType();
src/link/MachO.zig+1-1
...@@ -3877,7 +3877,7 @@ fn needsPointerRebase(ty: Type, val: Value) bool {...@@ -3877,7 +3877,7 @@ fn needsPointerRebase(ty: Type, val: Value) bool {
3877 .Struct => {3877 .Struct => {
3878 const fields = ty.structFields().values();3878 const fields = ty.structFields().values();
3879 if (fields.len == 0) return false;3879 if (fields.len == 0) return false;
3880 if (val.castTag(.@"struct")) |payload| {3880 if (val.castTag(.aggregate)) |payload| {
3881 const field_values = payload.data;3881 const field_values = payload.data;
3882 for (field_values) |field_val, i| {3882 for (field_values) |field_val, i| {
3883 if (needsPointerRebase(fields[i].ty, field_val)) return true;3883 if (needsPointerRebase(fields[i].ty, field_val)) return true;
src/type.zig+2
...@@ -3568,6 +3568,8 @@ pub const Type = extern union {...@@ -3568,6 +3568,8 @@ pub const Type = extern union {
3568 .const_slice_u8,3568 .const_slice_u8,
3569 .const_slice,3569 .const_slice,
3570 .mut_slice,3570 .mut_slice,
3571 .tuple,
3572 .empty_struct_literal,
3571 => return null,3573 => return null,
35723574
3573 .pointer => return self.castTag(.pointer).?.data.sentinel,3575 .pointer => return self.castTag(.pointer).?.data.sentinel,
src/value.zig+54-90
...@@ -127,10 +127,6 @@ pub const Value = extern union {...@@ -127,10 +127,6 @@ pub const Value = extern union {
127 /// This value is repeated some number of times. The amount of times to repeat127 /// This value is repeated some number of times. The amount of times to repeat
128 /// is stored externally.128 /// is stored externally.
129 repeated,129 repeated,
130 /// Each element stored as a `Value`.
131 /// In the case of sentinel-terminated arrays, the sentinel value *is* stored,
132 /// so the slice length will be one more than the type's array length.
133 array,
134 /// An array with length 0 but it has a sentinel.130 /// An array with length 0 but it has a sentinel.
135 empty_array_sentinel,131 empty_array_sentinel,
136 /// Pointer and length as sub `Value` objects.132 /// Pointer and length as sub `Value` objects.
...@@ -162,8 +158,11 @@ pub const Value = extern union {...@@ -162,8 +158,11 @@ pub const Value = extern union {
162 opt_payload,158 opt_payload,
163 /// A pointer to the payload of an optional, based on a pointer to an optional.159 /// A pointer to the payload of an optional, based on a pointer to an optional.
164 opt_payload_ptr,160 opt_payload_ptr,
165 /// An instance of a struct.161 /// An instance of a struct, array, or vector.
166 @"struct",162 /// Each element/field stored as a `Value`.
163 /// In the case of sentinel-terminated arrays, the sentinel value *is* stored,
164 /// so the slice length will be one more than the type's array length.
165 aggregate,
167 /// An instance of a union.166 /// An instance of a union.
168 @"union",167 @"union",
169 /// This is a special value that tracks a set of types that have been stored168 /// This is a special value that tracks a set of types that have been stored
...@@ -279,7 +278,6 @@ pub const Value = extern union {...@@ -279,7 +278,6 @@ pub const Value = extern union {
279 .enum_literal,278 .enum_literal,
280 => Payload.Bytes,279 => Payload.Bytes,
281280
282 .array => Payload.Array,
283 .slice => Payload.Slice,281 .slice => Payload.Slice,
284282
285 .enum_field_index => Payload.U32,283 .enum_field_index => Payload.U32,
...@@ -301,7 +299,7 @@ pub const Value = extern union {...@@ -301,7 +299,7 @@ pub const Value = extern union {
301 .@"error" => Payload.Error,299 .@"error" => Payload.Error,
302 .inferred_alloc => Payload.InferredAlloc,300 .inferred_alloc => Payload.InferredAlloc,
303 .inferred_alloc_comptime => Payload.InferredAllocComptime,301 .inferred_alloc_comptime => Payload.InferredAllocComptime,
304 .@"struct" => Payload.Struct,302 .aggregate => Payload.Aggregate,
305 .@"union" => Payload.Union,303 .@"union" => Payload.Union,
306 .bound_fn => Payload.BoundFn,304 .bound_fn => Payload.BoundFn,
307 };305 };
...@@ -521,18 +519,6 @@ pub const Value = extern union {...@@ -521,18 +519,6 @@ pub const Value = extern union {
521 };519 };
522 return Value{ .ptr_otherwise = &new_payload.base };520 return Value{ .ptr_otherwise = &new_payload.base };
523 },521 },
524 .array => {
525 const payload = self.castTag(.array).?;
526 const new_payload = try arena.create(Payload.Array);
527 new_payload.* = .{
528 .base = payload.base,
529 .data = try arena.alloc(Value, payload.data.len),
530 };
531 for (new_payload.data) |*elem, i| {
532 elem.* = try payload.data[i].copy(arena);
533 }
534 return Value{ .ptr_otherwise = &new_payload.base };
535 },
536 .slice => {522 .slice => {
537 const payload = self.castTag(.slice).?;523 const payload = self.castTag(.slice).?;
538 const new_payload = try arena.create(Payload.Slice);524 const new_payload = try arena.create(Payload.Slice);
...@@ -562,15 +548,15 @@ pub const Value = extern union {...@@ -562,15 +548,15 @@ pub const Value = extern union {
562 .enum_field_index => return self.copyPayloadShallow(arena, Payload.U32),548 .enum_field_index => return self.copyPayloadShallow(arena, Payload.U32),
563 .@"error" => return self.copyPayloadShallow(arena, Payload.Error),549 .@"error" => return self.copyPayloadShallow(arena, Payload.Error),
564550
565 .@"struct" => {551 .aggregate => {
566 const old_field_values = self.castTag(.@"struct").?.data;552 const payload = self.castTag(.aggregate).?;
567 const new_payload = try arena.create(Payload.Struct);553 const new_payload = try arena.create(Payload.Aggregate);
568 new_payload.* = .{554 new_payload.* = .{
569 .base = .{ .tag = .@"struct" },555 .base = payload.base,
570 .data = try arena.alloc(Value, old_field_values.len),556 .data = try arena.alloc(Value, payload.data.len),
571 };557 };
572 for (old_field_values) |old_field_val, i| {558 for (new_payload.data) |*elem, i| {
573 new_payload.data[i] = try old_field_val.copy(arena);559 elem.* = try payload.data[i].copy(arena);
574 }560 }
575 return Value{ .ptr_otherwise = &new_payload.base };561 return Value{ .ptr_otherwise = &new_payload.base };
576 },562 },
...@@ -677,8 +663,8 @@ pub const Value = extern union {...@@ -677,8 +663,8 @@ pub const Value = extern union {
677 .abi_align_default => return out_stream.writeAll("(default ABI alignment)"),663 .abi_align_default => return out_stream.writeAll("(default ABI alignment)"),
678664
679 .empty_struct_value => return out_stream.writeAll("struct {}{}"),665 .empty_struct_value => return out_stream.writeAll("struct {}{}"),
680 .@"struct" => {666 .aggregate => {
681 return out_stream.writeAll("(struct value)");667 return out_stream.writeAll("(aggregate)");
682 },668 },
683 .@"union" => {669 .@"union" => {
684 return out_stream.writeAll("(union value)");670 return out_stream.writeAll("(union value)");
...@@ -733,7 +719,6 @@ pub const Value = extern union {...@@ -733,7 +719,6 @@ pub const Value = extern union {
733 try out_stream.writeAll("(repeated) ");719 try out_stream.writeAll("(repeated) ");
734 val = val.castTag(.repeated).?.data;720 val = val.castTag(.repeated).?.data;
735 },721 },
736 .array => return out_stream.writeAll("(array)"),
737 .empty_array_sentinel => return out_stream.writeAll("(empty array with sentinel)"),722 .empty_array_sentinel => return out_stream.writeAll("(empty array with sentinel)"),
738 .slice => return out_stream.writeAll("(slice)"),723 .slice => return out_stream.writeAll("(slice)"),
739 .float_16 => return out_stream.print("{}", .{val.castTag(.float_16).?.data}),724 .float_16 => return out_stream.print("{}", .{val.castTag(.float_16).?.data}),
...@@ -1087,7 +1072,7 @@ pub const Value = extern union {...@@ -1087,7 +1072,7 @@ pub const Value = extern union {
1087 .Auto => unreachable, // Sema is supposed to have emitted a compile error already1072 .Auto => unreachable, // Sema is supposed to have emitted a compile error already
1088 .Extern => {1073 .Extern => {
1089 const fields = ty.structFields().values();1074 const fields = ty.structFields().values();
1090 const field_vals = val.castTag(.@"struct").?.data;1075 const field_vals = val.castTag(.aggregate).?.data;
1091 for (fields) |field, i| {1076 for (fields) |field, i| {
1092 const off = @intCast(usize, ty.structFieldOffset(i, target));1077 const off = @intCast(usize, ty.structFieldOffset(i, target));
1093 writeToMemory(field_vals[i], field.ty, target, buffer[off..]);1078 writeToMemory(field_vals[i], field.ty, target, buffer[off..]);
...@@ -1110,7 +1095,7 @@ pub const Value = extern union {...@@ -1110,7 +1095,7 @@ pub const Value = extern union {
1110 fn packedStructToInt(val: Value, ty: Type, target: Target, buf: []std.math.big.Limb) BigIntConst {1095 fn packedStructToInt(val: Value, ty: Type, target: Target, buf: []std.math.big.Limb) BigIntConst {
1111 var bigint = BigIntMutable.init(buf, 0);1096 var bigint = BigIntMutable.init(buf, 0);
1112 const fields = ty.structFields().values();1097 const fields = ty.structFields().values();
1113 const field_vals = val.castTag(.@"struct").?.data;1098 const field_vals = val.castTag(.aggregate).?.data;
1114 var bits: u16 = 0;1099 var bits: u16 = 0;
1115 // TODO allocate enough heap space instead of using this buffer1100 // TODO allocate enough heap space instead of using this buffer
1116 // on the stack.1101 // on the stack.
...@@ -1185,7 +1170,7 @@ pub const Value = extern union {...@@ -1185,7 +1170,7 @@ pub const Value = extern union {
1185 elem.* = try readFromMemory(elem_ty, target, buffer[offset..], arena);1170 elem.* = try readFromMemory(elem_ty, target, buffer[offset..], arena);
1186 offset += @intCast(usize, elem_size);1171 offset += @intCast(usize, elem_size);
1187 }1172 }
1188 return Tag.array.create(arena, elems);1173 return Tag.aggregate.create(arena, elems);
1189 },1174 },
1190 .Struct => switch (ty.containerLayout()) {1175 .Struct => switch (ty.containerLayout()) {
1191 .Auto => unreachable, // Sema is supposed to have emitted a compile error already1176 .Auto => unreachable, // Sema is supposed to have emitted a compile error already
...@@ -1196,7 +1181,7 @@ pub const Value = extern union {...@@ -1196,7 +1181,7 @@ pub const Value = extern union {
1196 const off = @intCast(usize, ty.structFieldOffset(i, target));1181 const off = @intCast(usize, ty.structFieldOffset(i, target));
1197 field_vals[i] = try readFromMemory(field.ty, target, buffer[off..], arena);1182 field_vals[i] = try readFromMemory(field.ty, target, buffer[off..], arena);
1198 }1183 }
1199 return Tag.@"struct".create(arena, field_vals);1184 return Tag.aggregate.create(arena, field_vals);
1200 },1185 },
1201 .Packed => {1186 .Packed => {
1202 const endian = target.cpu.arch.endian();1187 const endian = target.cpu.arch.endian();
...@@ -1250,7 +1235,7 @@ pub const Value = extern union {...@@ -1250,7 +1235,7 @@ pub const Value = extern union {
1250 else => unreachable,1235 else => unreachable,
1251 };1236 };
1252 }1237 }
1253 return Tag.@"struct".create(arena, field_vals);1238 return Tag.aggregate.create(arena, field_vals);
1254 }1239 }
12551240
1256 fn bitCastBigIntToFloat(1241 fn bitCastBigIntToFloat(
...@@ -1827,9 +1812,9 @@ pub const Value = extern union {...@@ -1827,9 +1812,9 @@ pub const Value = extern union {
1827 assert(op == .eq);1812 assert(op == .eq);
1828 return lhs.castTag(.repeated).?.data.compareWithZero(.eq);1813 return lhs.castTag(.repeated).?.data.compareWithZero(.eq);
1829 },1814 },
1830 .array => {1815 .aggregate => {
1831 assert(op == .eq);1816 assert(op == .eq);
1832 for (lhs.cast(Payload.Array).?.data) |elem_val| {1817 for (lhs.castTag(.aggregate).?.data) |elem_val| {
1833 if (!elem_val.compareWithZero(.eq)) return false;1818 if (!elem_val.compareWithZero(.eq)) return false;
1834 }1819 }
1835 return true;1820 return true;
...@@ -1898,29 +1883,16 @@ pub const Value = extern union {...@@ -1898,29 +1883,16 @@ pub const Value = extern union {
1898 },1883 },
1899 .eu_payload_ptr => @panic("TODO: Implement more pointer eql cases"),1884 .eu_payload_ptr => @panic("TODO: Implement more pointer eql cases"),
1900 .opt_payload_ptr => @panic("TODO: Implement more pointer eql cases"),1885 .opt_payload_ptr => @panic("TODO: Implement more pointer eql cases"),
1901 .array => {
1902 const a_array = a.castTag(.array).?.data;
1903 const b_array = b.castTag(.array).?.data;
1904
1905 if (a_array.len != b_array.len) return false;
1906
1907 const elem_ty = ty.childType();
1908 for (a_array) |a_elem, i| {
1909 const b_elem = b_array[i];
1910
1911 if (!eql(a_elem, b_elem, elem_ty)) return false;
1912 }
1913 return true;
1914 },
1915 .function => {1886 .function => {
1916 const a_payload = a.castTag(.function).?.data;1887 const a_payload = a.castTag(.function).?.data;
1917 const b_payload = b.castTag(.function).?.data;1888 const b_payload = b.castTag(.function).?.data;
1918 return a_payload == b_payload;1889 return a_payload == b_payload;
1919 },1890 },
1920 .@"struct" => {1891 .aggregate => {
1921 const a_field_vals = a.castTag(.@"struct").?.data;1892 const a_field_vals = a.castTag(.aggregate).?.data;
1922 const b_field_vals = b.castTag(.@"struct").?.data;1893 const b_field_vals = b.castTag(.aggregate).?.data;
1923 assert(a_field_vals.len == b_field_vals.len);1894 assert(a_field_vals.len == b_field_vals.len);
1895
1924 if (ty.isTupleOrAnonStruct()) {1896 if (ty.isTupleOrAnonStruct()) {
1925 const types = ty.tupleFields().types;1897 const types = ty.tupleFields().types;
1926 assert(types.len == a_field_vals.len);1898 assert(types.len == a_field_vals.len);
...@@ -1929,10 +1901,21 @@ pub const Value = extern union {...@@ -1929,10 +1901,21 @@ pub const Value = extern union {
1929 }1901 }
1930 return true;1902 return true;
1931 }1903 }
1932 const fields = ty.structFields().values();1904
1933 assert(fields.len == a_field_vals.len);1905 if (ty.zigTypeTag() == .Struct) {
1934 for (fields) |field, i| {1906 const fields = ty.structFields().values();
1935 if (!eql(a_field_vals[i], b_field_vals[i], field.ty)) return false;1907 assert(fields.len == a_field_vals.len);
1908 for (fields) |field, i| {
1909 if (!eql(a_field_vals[i], b_field_vals[i], field.ty)) return false;
1910 }
1911 return true;
1912 }
1913
1914 const elem_ty = ty.childType();
1915 for (a_field_vals) |a_elem, i| {
1916 const b_elem = b_field_vals[i];
1917
1918 if (!eql(a_elem, b_elem, elem_ty)) return false;
1936 }1919 }
1937 return true;1920 return true;
1938 },1921 },
...@@ -2002,7 +1985,7 @@ pub const Value = extern union {...@@ -2002,7 +1985,7 @@ pub const Value = extern union {
2002 },1985 },
2003 .Struct => {1986 .Struct => {
2004 // A tuple can be represented with .empty_struct_value,1987 // A tuple can be represented with .empty_struct_value,
2005 // the_one_possible_value, .@"struct" in which case we could1988 // the_one_possible_value, .aggregate in which case we could
2006 // end up here and the values are equal if the type has zero fields.1989 // end up here and the values are equal if the type has zero fields.
2007 return ty.structFieldCount() != 0;1990 return ty.structFieldCount() != 0;
2008 },1991 },
...@@ -2072,8 +2055,8 @@ pub const Value = extern union {...@@ -2072,8 +2055,8 @@ pub const Value = extern union {
2072 field.default_val.hash(field.ty, hasher);2055 field.default_val.hash(field.ty, hasher);
2073 }2056 }
2074 },2057 },
2075 .@"struct" => {2058 .aggregate => {
2076 const field_values = val.castTag(.@"struct").?.data;2059 const field_values = val.castTag(.aggregate).?.data;
2077 for (field_values) |field_val, i| {2060 for (field_values) |field_val, i| {
2078 field_val.hash(fields[i].ty, hasher);2061 field_val.hash(fields[i].ty, hasher);
2079 }2062 }
...@@ -2190,19 +2173,12 @@ pub const Value = extern union {...@@ -2190,19 +2173,12 @@ pub const Value = extern union {
2190 if (val.isComptimeMutablePtr()) return true;2173 if (val.isComptimeMutablePtr()) return true;
2191 switch (val.tag()) {2174 switch (val.tag()) {
2192 .repeated => return val.castTag(.repeated).?.data.canMutateComptimeVarState(),2175 .repeated => return val.castTag(.repeated).?.data.canMutateComptimeVarState(),
2193 .array => {
2194 const elems = val.cast(Payload.Array).?.data;
2195 for (elems) |elem| {
2196 if (elem.canMutateComptimeVarState()) return true;
2197 }
2198 return false;
2199 },
2200 .eu_payload => return val.castTag(.eu_payload).?.data.canMutateComptimeVarState(),2176 .eu_payload => return val.castTag(.eu_payload).?.data.canMutateComptimeVarState(),
2201 .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.canMutateComptimeVarState(),2177 .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.canMutateComptimeVarState(),
2202 .opt_payload => return val.castTag(.opt_payload).?.data.canMutateComptimeVarState(),2178 .opt_payload => return val.castTag(.opt_payload).?.data.canMutateComptimeVarState(),
2203 .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.canMutateComptimeVarState(),2179 .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.canMutateComptimeVarState(),
2204 .@"struct" => {2180 .aggregate => {
2205 const fields = val.cast(Payload.Struct).?.data;2181 const fields = val.castTag(.aggregate).?.data;
2206 for (fields) |field| {2182 for (fields) |field| {
2207 if (field.canMutateComptimeVarState()) return true;2183 if (field.canMutateComptimeVarState()) return true;
2208 }2184 }
...@@ -2302,11 +2278,6 @@ pub const Value = extern union {...@@ -2302,11 +2278,6 @@ pub const Value = extern union {
2302 .empty_array_sentinel,2278 .empty_array_sentinel,
2303 => return markReferencedDeclsAlive(val.cast(Payload.SubValue).?.data),2279 => return markReferencedDeclsAlive(val.cast(Payload.SubValue).?.data),
23042280
2305 .array => {
2306 for (val.cast(Payload.Array).?.data) |elem_val| {
2307 markReferencedDeclsAlive(elem_val);
2308 }
2309 },
2310 .slice => {2281 .slice => {
2311 const slice = val.cast(Payload.Slice).?.data;2282 const slice = val.cast(Payload.Slice).?.data;
2312 markReferencedDeclsAlive(slice.ptr);2283 markReferencedDeclsAlive(slice.ptr);
...@@ -2321,8 +2292,8 @@ pub const Value = extern union {...@@ -2321,8 +2292,8 @@ pub const Value = extern union {
2321 const field_ptr = val.cast(Payload.FieldPtr).?.data;2292 const field_ptr = val.cast(Payload.FieldPtr).?.data;
2322 return markReferencedDeclsAlive(field_ptr.container_ptr);2293 return markReferencedDeclsAlive(field_ptr.container_ptr);
2323 },2294 },
2324 .@"struct" => {2295 .aggregate => {
2325 for (val.cast(Payload.Struct).?.data) |field_val| {2296 for (val.castTag(.aggregate).?.data) |field_val| {
2326 markReferencedDeclsAlive(field_val);2297 markReferencedDeclsAlive(field_val);
2327 }2298 }
2328 },2299 },
...@@ -2405,7 +2376,7 @@ pub const Value = extern union {...@@ -2405,7 +2376,7 @@ pub const Value = extern union {
2405 // No matter the index; all the elements are the same!2376 // No matter the index; all the elements are the same!
2406 .repeated => return val.castTag(.repeated).?.data,2377 .repeated => return val.castTag(.repeated).?.data,
24072378
2408 .array => return val.castTag(.array).?.data[index],2379 .aggregate => return val.castTag(.aggregate).?.data[index],
2409 .slice => return val.castTag(.slice).?.data.ptr.elemValueAdvanced(index, arena, buffer),2380 .slice => return val.castTag(.slice).?.data.ptr.elemValueAdvanced(index, arena, buffer),
24102381
2411 .decl_ref => return val.castTag(.decl_ref).?.data.val.elemValueAdvanced(index, arena, buffer),2382 .decl_ref => return val.castTag(.decl_ref).?.data.val.elemValueAdvanced(index, arena, buffer),
...@@ -2426,8 +2397,8 @@ pub const Value = extern union {...@@ -2426,8 +2397,8 @@ pub const Value = extern union {
2426 pub fn fieldValue(val: Value, allocator: Allocator, index: usize) error{OutOfMemory}!Value {2397 pub fn fieldValue(val: Value, allocator: Allocator, index: usize) error{OutOfMemory}!Value {
2427 _ = allocator;2398 _ = allocator;
2428 switch (val.tag()) {2399 switch (val.tag()) {
2429 .@"struct" => {2400 .aggregate => {
2430 const field_values = val.castTag(.@"struct").?.data;2401 const field_values = val.castTag(.aggregate).?.data;
2431 return field_values[index];2402 return field_values[index];
2432 },2403 },
2433 .@"union" => {2404 .@"union" => {
...@@ -4199,8 +4170,10 @@ pub const Value = extern union {...@@ -4199,8 +4170,10 @@ pub const Value = extern union {
4199 data: []const u8,4170 data: []const u8,
4200 };4171 };
42014172
4202 pub const Array = struct {4173 pub const Aggregate = struct {
4203 base: Payload,4174 base: Payload,
4175 /// Field values. The types are according to the struct or array type.
4176 /// The length is provided here so that copying a Value does not depend on the Type.
4204 data: []Value,4177 data: []Value,
4205 };4178 };
42064179
...@@ -4298,15 +4271,6 @@ pub const Value = extern union {...@@ -4298,15 +4271,6 @@ pub const Value = extern union {
4298 },4271 },
4299 };4272 };
43004273
4301 pub const Struct = struct {
4302 pub const base_tag = Tag.@"struct";
4303
4304 base: Payload = .{ .tag = base_tag },
4305 /// Field values. The types are according to the struct type.
4306 /// The length is provided here so that copying a Value does not depend on the Type.
4307 data: []Value,
4308 };
4309
4310 pub const Union = struct {4274 pub const Union = struct {
4311 pub const base_tag = Tag.@"union";4275 pub const base_tag = Tag.@"union";
43124276
test/behavior/tuple.zig+5-1
...@@ -129,7 +129,11 @@ test "tuple initializer for var" {...@@ -129,7 +129,11 @@ test "tuple initializer for var" {
129}129}
130130
131test "array-like initializer for tuple types" {131test "array-like initializer for tuple types" {
132 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO132 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
133 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
134 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
135 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
136 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
133137
134 const T = @Type(.{138 const T = @Type(.{
135 .Struct = .{139 .Struct = .{