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 {
53855385 .len = test_fn_vals.len,
53865386 .elem_type = try tmp_test_fn_ty.copy(arena),
53875387 }),
5388 .val = try Value.Tag.array.create(arena, test_fn_vals),
5388 .val = try Value.Tag.aggregate.create(arena, test_fn_vals),
53895389 });
53905390
53915391 // Add a dependency on each test name and function pointer.
......@@ -5417,7 +5417,7 @@ pub fn populateTestFunctions(mod: *Module) !void {
54175417 try Value.Tag.decl_ref.create(arena, test_decl), // func
54185418 Value.initTag(.null_value), // async_frame_size
54195419 };
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);
54215421 }
54225422
54235423 try array_decl.finalizeNewArena(&new_decl_arena);
src/Sema.zig+73-73
......@@ -3119,7 +3119,7 @@ fn validateStructInit(
31193119 field_values[i] = fields[i].default_val;
31203120 }
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);
31233123 const struct_init = try sema.addConstant(struct_ty, struct_val);
31243124 try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store);
31253125 return;
......@@ -3246,7 +3246,7 @@ fn zirValidateArrayInit(
32463246
32473247 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);
32503250 const array_init = try sema.addConstant(array_ty, array_val);
32513251 try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store);
32523252 }
......@@ -8175,7 +8175,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
81758175 }
81768176 return sema.addConstant(
81778177 operand_type,
8178 try Value.Tag.array.create(sema.arena, elems),
8178 try Value.Tag.aggregate.create(sema.arena, elems),
81798179 );
81808180 } else {
81818181 const result_val = try val.bitwiseNot(scalar_type, sema.arena, target);
......@@ -8239,7 +8239,7 @@ fn analyzeTupleCat(
82398239 });
82408240
82418241 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);
82438243 return sema.addConstant(tuple_ty, tuple_val);
82448244 };
82458245
......@@ -8334,7 +8334,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
83348334 .len = final_len,
83358335 .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()),
83368336 });
8337 const val = try Value.Tag.array.create(anon_decl.arena(), buf);
8337 const val = try Value.Tag.aggregate.create(anon_decl.arena(), buf);
83388338 const decl = try anon_decl.finish(ty, val);
83398339 if (lhs_single_ptr or rhs_single_ptr) {
83408340 return sema.analyzeDeclRef(decl);
......@@ -8419,7 +8419,7 @@ fn analyzeTupleMul(
84198419 });
84208420
84218421 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);
84238423 return sema.addConstant(tuple_ty, tuple_val);
84248424 };
84258425
......@@ -8506,7 +8506,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
85068506 if (mulinfo.sentinel) |sent| {
85078507 buf[final_len] = try sent.copy(anon_decl.arena());
85088508 }
8509 break :blk try Value.Tag.array.create(anon_decl.arena(), buf);
8509 break :blk try Value.Tag.aggregate.create(anon_decl.arena(), buf);
85108510 };
85118511 const decl = try anon_decl.finish(final_ty, val);
85128512 if (is_single_ptr) {
......@@ -10186,7 +10186,7 @@ fn zirBuiltinSrc(
1018610186
1018710187 return sema.addConstant(
1018810188 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),
1019010190 );
1019110191}
1019210192
......@@ -10289,7 +10289,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1028910289 // arg_type: ?type,
1029010290 param_ty_val,
1029110291 };
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);
1029310293 }
1029410294
1029510295 const args_val = v: {
......@@ -10314,7 +10314,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1031410314 .len = param_vals.len,
1031510315 .elem_type = param_info_decl.ty,
1031610316 }),
10317 try Value.Tag.array.create(
10317 try Value.Tag.aggregate.create(
1031810318 params_anon_decl.arena(),
1031910319 param_vals,
1032010320 ),
......@@ -10345,7 +10345,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1034510345 type_info_ty,
1034610346 try Value.Tag.@"union".create(sema.arena, .{
1034710347 .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),
1034910349 }),
1035010350 );
1035110351 },
......@@ -10364,7 +10364,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1036410364 type_info_ty,
1036510365 try Value.Tag.@"union".create(sema.arena, .{
1036610366 .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),
1036810368 }),
1036910369 );
1037010370 },
......@@ -10377,7 +10377,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1037710377 type_info_ty,
1037810378 try Value.Tag.@"union".create(sema.arena, .{
1037910379 .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),
1038110381 }),
1038210382 );
1038310383 },
......@@ -10412,7 +10412,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1041210412 type_info_ty,
1041310413 try Value.Tag.@"union".create(sema.arena, .{
1041410414 .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),
1041610416 }),
1041710417 );
1041810418 },
......@@ -10430,7 +10430,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1043010430 type_info_ty,
1043110431 try Value.Tag.@"union".create(sema.arena, .{
1043210432 .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),
1043410434 }),
1043510435 );
1043610436 },
......@@ -10446,7 +10446,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1044610446 type_info_ty,
1044710447 try Value.Tag.@"union".create(sema.arena, .{
1044810448 .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),
1045010450 }),
1045110451 );
1045210452 },
......@@ -10459,7 +10459,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1045910459 type_info_ty,
1046010460 try Value.Tag.@"union".create(sema.arena, .{
1046110461 .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),
1046310463 }),
1046410464 );
1046510465 },
......@@ -10509,7 +10509,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1050910509 name_val,
1051010510 };
1051110511
10512 field_val.* = try Value.Tag.@"struct".create(
10512 field_val.* = try Value.Tag.aggregate.create(
1051310513 fields_anon_decl.arena(),
1051410514 error_field_fields,
1051510515 );
......@@ -10525,7 +10525,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1052510525 .len = vals.len,
1052610526 .elem_type = error_field_ty,
1052710527 }),
10528 try Value.Tag.array.create(
10528 try Value.Tag.aggregate.create(
1052910529 fields_anon_decl.arena(),
1053010530 vals,
1053110531 ),
......@@ -10559,7 +10559,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1055910559 type_info_ty,
1056010560 try Value.Tag.@"union".create(sema.arena, .{
1056110561 .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),
1056310563 }),
1056410564 );
1056510565 },
......@@ -10618,7 +10618,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1061810618 // value: comptime_int,
1061910619 int_val,
1062010620 };
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);
1062210622 }
1062310623
1062410624 const fields_val = v: {
......@@ -10627,7 +10627,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1062710627 .len = enum_field_vals.len,
1062810628 .elem_type = enum_field_ty,
1062910629 }),
10630 try Value.Tag.array.create(
10630 try Value.Tag.aggregate.create(
1063110631 fields_anon_decl.arena(),
1063210632 enum_field_vals,
1063310633 ),
......@@ -10659,7 +10659,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1065910659 type_info_ty,
1066010660 try Value.Tag.@"union".create(sema.arena, .{
1066110661 .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),
1066310663 }),
1066410664 );
1066510665 },
......@@ -10717,7 +10717,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1071710717 // alignment: comptime_int,
1071810718 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
1071910719 };
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);
1072110721 }
1072210722
1072310723 const fields_val = v: {
......@@ -10726,7 +10726,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1072610726 .len = union_field_vals.len,
1072710727 .elem_type = union_field_ty,
1072810728 }),
10729 try Value.Tag.array.create(
10729 try Value.Tag.aggregate.create(
1073010730 fields_anon_decl.arena(),
1073110731 try fields_anon_decl.arena().dupe(Value, union_field_vals),
1073210732 ),
......@@ -10761,7 +10761,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1076110761 type_info_ty,
1076210762 try Value.Tag.@"union".create(sema.arena, .{
1076310763 .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),
1076510765 }),
1076610766 );
1076710767 },
......@@ -10827,7 +10827,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1082710827 // alignment: comptime_int,
1082810828 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
1082910829 };
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);
1083110831 }
1083210832 break :fv struct_field_vals;
1083310833 }
......@@ -10871,7 +10871,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1087110871 // alignment: comptime_int,
1087210872 try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
1087310873 };
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);
1087510875 }
1087610876 break :fv struct_field_vals;
1087710877 };
......@@ -10882,7 +10882,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1088210882 .len = struct_field_vals.len,
1088310883 .elem_type = struct_field_ty,
1088410884 }),
10885 try Value.Tag.array.create(
10885 try Value.Tag.aggregate.create(
1088610886 fields_anon_decl.arena(),
1088710887 try fields_anon_decl.arena().dupe(Value, struct_field_vals),
1088810888 ),
......@@ -10911,7 +10911,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1091110911 type_info_ty,
1091210912 try Value.Tag.@"union".create(sema.arena, .{
1091310913 .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),
1091510915 }),
1091610916 );
1091710917 },
......@@ -10931,7 +10931,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1093110931 type_info_ty,
1093210932 try Value.Tag.@"union".create(sema.arena, .{
1093310933 .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),
1093510935 }),
1093610936 );
1093710937 },
......@@ -10987,7 +10987,7 @@ fn typeInfoDecls(
1098710987 //is_pub: bool,
1098810988 Value.makeBool(decl.is_pub),
1098910989 };
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);
1099110991 }
1099210992
1099310993 const new_decl = try decls_anon_decl.finish(
......@@ -10995,7 +10995,7 @@ fn typeInfoDecls(
1099510995 .len = decls_vals.len,
1099610996 .elem_type = declaration_ty,
1099710997 }),
10998 try Value.Tag.array.create(
10998 try Value.Tag.aggregate.create(
1099910999 decls_anon_decl.arena(),
1100011000 try decls_anon_decl.arena().dupe(Value, decls_vals),
1100111001 ),
......@@ -11816,7 +11816,7 @@ fn finishStructInit(
1181611816 for (field_inits) |field_init, i| {
1181711817 values[i] = (sema.resolveMaybeUndefVal(block, src, field_init) catch unreachable).?;
1181811818 }
11819 const struct_val = try Value.Tag.@"struct".create(sema.arena, values);
11819 const struct_val = try Value.Tag.aggregate.create(sema.arena, values);
1182011820 return sema.addConstantMaybeRef(block, src, struct_ty, struct_val, is_ref);
1182111821 }
1182211822
......@@ -11877,7 +11877,7 @@ fn zirStructInitAnon(
1187711877 });
1187811878
1187911879 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);
1188111881 return sema.addConstantMaybeRef(block, src, tuple_ty, tuple_val, is_ref);
1188211882 };
1188311883
......@@ -11974,7 +11974,7 @@ fn zirArrayInit(
1197411974 elem_vals[i] = (sema.resolveMaybeUndefVal(block, src, arg) catch unreachable).?;
1197511975 }
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);
1197811978 return sema.addConstantMaybeRef(block, src, array_ty, array_val, is_ref);
1197911979 };
1198011980
......@@ -12043,7 +12043,7 @@ fn zirArrayInitAnon(
1204312043 });
1204412044
1204512045 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);
1204712047 return sema.addConstantMaybeRef(block, src, tuple_ty, tuple_val, is_ref);
1204812048 };
1204912049
......@@ -12250,7 +12250,7 @@ fn zirUnaryMath(
1225012250 }
1225112251 return sema.addConstant(
1225212252 result_ty,
12253 try Value.Tag.array.create(sema.arena, elems),
12253 try Value.Tag.aggregate.create(sema.arena, elems),
1225412254 );
1225512255 }
1225612256
......@@ -12350,7 +12350,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1235012350 .AnyFrame => return Air.Inst.Ref.anyframe_type,
1235112351 .EnumLiteral => return Air.Inst.Ref.enum_literal_type,
1235212352 .Int => {
12353 const struct_val = union_val.val.castTag(.@"struct").?.data;
12353 const struct_val = union_val.val.castTag(.aggregate).?.data;
1235412354 // TODO use reflection instead of magic numbers here
1235512355 const signedness_val = struct_val[0];
1235612356 const bits_val = struct_val[1];
......@@ -12364,7 +12364,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1236412364 return sema.addType(ty);
1236512365 },
1236612366 .Vector => {
12367 const struct_val = union_val.val.castTag(.@"struct").?.data;
12367 const struct_val = union_val.val.castTag(.aggregate).?.data;
1236812368 // TODO use reflection instead of magic numbers here
1236912369 const len_val = struct_val[0];
1237012370 const child_val = struct_val[1];
......@@ -12377,7 +12377,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1237712377 return sema.addType(ty);
1237812378 },
1237912379 .Float => {
12380 const struct_val = union_val.val.castTag(.@"struct").?.data;
12380 const struct_val = union_val.val.castTag(.aggregate).?.data;
1238112381 // TODO use reflection instead of magic numbers here
1238212382 // bits: comptime_int,
1238312383 const bits_val = struct_val[0];
......@@ -12394,7 +12394,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1239412394 return sema.addType(ty);
1239512395 },
1239612396 .Pointer => {
12397 const struct_val = union_val.val.castTag(.@"struct").?.data;
12397 const struct_val = union_val.val.castTag(.aggregate).?.data;
1239812398 // TODO use reflection instead of magic numbers here
1239912399 const size_val = struct_val[0];
1240012400 const is_const_val = struct_val[1];
......@@ -12436,7 +12436,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1243612436 return sema.addType(ty);
1243712437 },
1243812438 .Array => {
12439 const struct_val = union_val.val.castTag(.@"struct").?.data;
12439 const struct_val = union_val.val.castTag(.aggregate).?.data;
1244012440 // TODO use reflection instead of magic numbers here
1244112441 // len: comptime_int,
1244212442 const len_val = struct_val[0];
......@@ -12460,7 +12460,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1246012460 return sema.addType(ty);
1246112461 },
1246212462 .Optional => {
12463 const struct_val = union_val.val.castTag(.@"struct").?.data;
12463 const struct_val = union_val.val.castTag(.aggregate).?.data;
1246412464 // TODO use reflection instead of magic numbers here
1246512465 // child: type,
1246612466 const child_val = struct_val[0];
......@@ -12472,7 +12472,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1247212472 return sema.addType(ty);
1247312473 },
1247412474 .ErrorUnion => {
12475 const struct_val = union_val.val.castTag(.@"struct").?.data;
12475 const struct_val = union_val.val.castTag(.aggregate).?.data;
1247612476 // TODO use reflection instead of magic numbers here
1247712477 // error_set: type,
1247812478 const error_set_val = struct_val[0];
......@@ -12495,12 +12495,12 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1249512495 const slice_val = payload_val.castTag(.slice).?.data;
1249612496 const decl = slice_val.ptr.pointerDecl().?;
1249712497 try sema.ensureDeclAnalyzed(decl);
12498 const array_val = decl.val.castTag(.array).?.data;
12498 const array_val = decl.val.castTag(.aggregate).?.data;
1249912499
1250012500 var names: Module.ErrorSet.NameMap = .{};
1250112501 try names.ensureUnusedCapacity(sema.arena, array_val.len);
1250212502 for (array_val) |elem_val| {
12503 const struct_val = elem_val.castTag(.@"struct").?.data;
12503 const struct_val = elem_val.castTag(.aggregate).?.data;
1250412504 // TODO use reflection instead of magic numbers here
1250512505 // error_set: type,
1250612506 const name_val = struct_val[0];
......@@ -12516,7 +12516,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1251612516 },
1251712517 .Struct => {
1251812518 // 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;
1252012520 // layout: containerlayout,
1252112521 const layout_val = struct_val[0];
1252212522 // fields: []const enumfield,
......@@ -12537,7 +12537,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1253712537 try sema.reifyStruct(block, inst, src, layout_val, fields_val);
1253812538 },
1253912539 .Enum => {
12540 const struct_val = union_val.val.castTag(.@"struct").?.data;
12540 const struct_val = union_val.val.castTag(.aggregate).?.data;
1254112541 // TODO use reflection instead of magic numbers here
1254212542 // layout: ContainerLayout,
1254312543 const layout_val = struct_val[0];
......@@ -12617,9 +12617,9 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1261712617 .ty = enum_obj.tag_ty,
1261812618 });
1261912619
12620 const array_vals = decl.val.castTag(.array).?.data;
12620 const array_vals = decl.val.castTag(.aggregate).?.data;
1262112621 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;
1262312623 // TODO use reflection instead of magic numbers here
1262412624 // name: []const u8
1262512625 const name_val = field_struct_val[0];
......@@ -12648,7 +12648,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1264812648 return sema.analyzeDeclVal(block, src, new_decl);
1264912649 },
1265012650 .Opaque => {
12651 const struct_val = union_val.val.castTag(.@"struct").?.data;
12651 const struct_val = union_val.val.castTag(.aggregate).?.data;
1265212652 // decls: []const Declaration,
1265312653 const decls_val = struct_val[0];
1265412654
......@@ -12694,7 +12694,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1269412694 .Union => return sema.fail(block, src, "TODO: Sema.zirReify for Union", .{}),
1269512695 .Fn => return sema.fail(block, src, "TODO: Sema.zirReify for Fn", .{}),
1269612696 .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"),
1269812698 }
1269912699}
1270012700
......@@ -12717,7 +12717,7 @@ fn reifyTuple(
1271712717 var i: usize = 0;
1271812718 while (i < fields_len) : (i += 1) {
1271912719 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;
1272112721 // TODO use reflection instead of magic numbers here
1272212722 // name: []const u8
1272312723 const name_val = field_struct_val[0];
......@@ -12818,7 +12818,7 @@ fn reifyStruct(
1281812818 var i: usize = 0;
1281912819 while (i < fields_len) : (i += 1) {
1282012820 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;
1282212822 // TODO use reflection instead of magic numbers here
1282312823 // name: []const u8
1282412824 const name_val = field_struct_val[0];
......@@ -13219,7 +13219,7 @@ fn zirBitCount(
1321913219 }
1322013220 return sema.addConstant(
1322113221 result_ty,
13222 try Value.Tag.array.create(sema.arena, elems),
13222 try Value.Tag.aggregate.create(sema.arena, elems),
1322313223 );
1322413224 } else {
1322513225 try sema.requireRuntimeBlock(block, operand_src);
......@@ -13985,7 +13985,7 @@ fn analyzeShuffle(
1398513985 values[i] = try b_val.elemValue(sema.arena, unsigned);
1398613986 }
1398713987 }
13988 const res_val = try Value.Tag.array.create(sema.arena, values);
13988 const res_val = try Value.Tag.aggregate.create(sema.arena, values);
1398913989 return sema.addConstant(res_ty, res_val);
1399013990 }
1399113991 }
......@@ -14008,7 +14008,7 @@ fn analyzeShuffle(
1400814008 while (i < max_len) : (i += 1) {
1400914009 expand_mask_values[i] = Value.negative_one;
1401014010 }
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
1401314013 if (a_len < b_len) {
1401414014 const undef = try sema.addConstUndef(a_ty);
......@@ -14454,7 +14454,7 @@ fn zirMinMax(
1445414454 }
1445514455 return sema.addConstant(
1445614456 simd_op.result_ty,
14457 try Value.Tag.array.create(sema.arena, elems),
14457 try Value.Tag.aggregate.create(sema.arena, elems),
1445814458 );
1445914459 } else rs: {
1446014460 if (simd_op.rhs_val) |rhs_val| {
......@@ -16016,7 +16016,7 @@ fn structFieldVal(
1601616016 return sema.addConstant(field.ty, opv);
1601716017 }
1601816018
16019 const field_values = struct_val.castTag(.@"struct").?.data;
16019 const field_values = struct_val.castTag(.aggregate).?.data;
1602016020 return sema.addConstant(field.ty, field_values[field_index]);
1602116021 }
1602216022
......@@ -16084,7 +16084,7 @@ fn tupleFieldValByIndex(
1608416084 if ((try sema.typeHasOnePossibleValue(block, src, field_ty))) |opv| {
1608516085 return sema.addConstant(field_ty, opv);
1608616086 }
16087 const field_values = tuple_val.castTag(.@"struct").?.data;
16087 const field_values = tuple_val.castTag(.aggregate).?.data;
1608816088 return sema.addConstant(field_ty, field_values[field_index]);
1608916089 }
1609016090
......@@ -16414,7 +16414,7 @@ fn tupleField(
1641416414
1641516415 if (try sema.resolveMaybeUndefVal(block, tuple_src, tuple)) |tuple_val| {
1641616416 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;
1641816418 return sema.addConstant(field_ty, field_values[field_index]);
1641916419 }
1642016420
......@@ -17510,7 +17510,7 @@ fn beginComptimePtrMutation(
1751017510 const elems = try arena.alloc(Value, array_len_including_sentinel);
1751117511 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
1751517515 return ComptimePtrMutationKit{
1751617516 .decl_ref_mut = parent.decl_ref_mut,
......@@ -17537,7 +17537,7 @@ fn beginComptimePtrMutation(
1753717537 elem.* = try Value.Tag.int_u64.create(arena, bytes[i]);
1753817538 }
1753917539
17540 parent.val.* = try Value.Tag.array.create(arena, elems);
17540 parent.val.* = try Value.Tag.aggregate.create(arena, elems);
1754117541
1754217542 return ComptimePtrMutationKit{
1754317543 .decl_ref_mut = parent.decl_ref_mut,
......@@ -17562,7 +17562,7 @@ fn beginComptimePtrMutation(
1756217562 const elems = try arena.alloc(Value, array_len_including_sentinel);
1756317563 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
1756717567 return ComptimePtrMutationKit{
1756817568 .decl_ref_mut = parent.decl_ref_mut,
......@@ -17571,9 +17571,9 @@ fn beginComptimePtrMutation(
1757117571 };
1757217572 },
1757317573
17574 .array => return ComptimePtrMutationKit{
17574 .aggregate => return ComptimePtrMutationKit{
1757517575 .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],
1757717577 .ty = elem_ty,
1757817578 },
1757917579
......@@ -17613,7 +17613,7 @@ fn beginComptimePtrMutation(
1761317613 const fields = try arena.alloc(Value, parent.ty.structFieldCount());
1761417614 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
1761817618 return ComptimePtrMutationKit{
1761917619 .decl_ref_mut = parent.decl_ref_mut,
......@@ -17639,9 +17639,9 @@ fn beginComptimePtrMutation(
1763917639 else => unreachable,
1764017640 }
1764117641 },
17642 .@"struct" => return ComptimePtrMutationKit{
17642 .aggregate => return ComptimePtrMutationKit{
1764317643 .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],
1764517645 .ty = field_ty,
1764617646 },
1764717647 .@"union" => {
......@@ -18209,7 +18209,7 @@ fn coerceArrayLike(
1820918209
1821018210 return sema.addConstant(
1821118211 dest_ty,
18212 try Value.Tag.array.create(sema.arena, element_vals),
18212 try Value.Tag.aggregate.create(sema.arena, element_vals),
1821318213 );
1821418214}
1821518215
......@@ -18266,7 +18266,7 @@ fn coerceTupleToArray(
1826618266
1826718267 return sema.addConstant(
1826818268 dest_ty,
18269 try Value.Tag.array.create(sema.arena, element_vals),
18269 try Value.Tag.aggregate.create(sema.arena, element_vals),
1827018270 );
1827118271}
1827218272
......@@ -18397,7 +18397,7 @@ fn coerceTupleToStruct(
1839718397
1839818398 return sema.addConstant(
1839918399 struct_ty,
18400 try Value.Tag.@"struct".create(sema.arena, field_vals),
18400 try Value.Tag.aggregate.create(sema.arena, field_vals),
1840118401 );
1840218402}
1840318403
src/codegen.zig+3-3
......@@ -225,9 +225,9 @@ pub fn generateSymbol(
225225 return Result{ .externally_managed = payload.data };
226226 }
227227 },
228 .array => {
228 .aggregate => {
229229 // 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;
231231 const elem_ty = typed_value.ty.elemType();
232232 for (elem_vals) |elem_val| {
233233 switch (try generateSymbol(bin_file, src_loc, .{
......@@ -554,7 +554,7 @@ pub fn generateSymbol(
554554 }
555555
556556 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;
558558 for (field_vals) |field_val, index| {
559559 const field_ty = typed_value.ty.structFieldType(index);
560560 if (!field_ty.hasRuntimeBits()) continue;
src/codegen/c.zig+1-1
......@@ -748,7 +748,7 @@ pub const DeclGen = struct {
748748 else => unreachable,
749749 },
750750 .Struct => {
751 const field_vals = val.castTag(.@"struct").?.data;
751 const field_vals = val.castTag(.aggregate).?.data;
752752
753753 try writer.writeAll("(");
754754 try dg.renderTypecast(writer, ty);
src/codegen/llvm.zig+72-7
......@@ -1511,8 +1511,8 @@ pub const DeclGen = struct {
15111511 .True, // don't null terminate. bytes has the sentinel, if any.
15121512 );
15131513 },
1514 .array => {
1515 const elem_vals = tv.val.castTag(.array).?.data;
1514 .aggregate => {
1515 const elem_vals = tv.val.castTag(.aggregate).?.data;
15161516 const elem_ty = tv.ty.elemType();
15171517 const gpa = dg.gpa;
15181518 const llvm_elems = try gpa.alloc(*const llvm.Value, elem_vals.len);
......@@ -1665,11 +1665,76 @@ pub const DeclGen = struct {
16651665 },
16661666 .Struct => {
16671667 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;
16691669 const gpa = dg.gpa;
1670 const struct_obj = tv.ty.castTag(.@"struct").?.data;
16711670 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
16731738 if (struct_obj.layout == .Packed) {
16741739 const big_bits = struct_obj.packedIntegerBits(target);
16751740 const int_llvm_ty = dg.context.intType(big_bits);
......@@ -1707,8 +1772,8 @@ pub const DeclGen = struct {
17071772 comptime assert(struct_layout_version == 2);
17081773 var offset: u64 = 0;
17091774 var big_align: u32 = 0;
1710
17111775 var need_unnamed = false;
1776
17121777 for (struct_obj.fields.values()) |field, i| {
17131778 if (field.is_comptime or !field.ty.hasRuntimeBitsIgnoreComptime()) continue;
17141779
......@@ -1854,10 +1919,10 @@ pub const DeclGen = struct {
18541919 @intCast(c_uint, llvm_elems.len),
18551920 );
18561921 },
1857 .array => {
1922 .aggregate => {
18581923 // Note, sentinel is not stored even if the type has a sentinel.
18591924 // 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;
18611926 const vector_len = @intCast(usize, tv.ty.arrayLen());
18621927 assert(vector_len == elem_vals.len or vector_len + 1 == elem_vals.len);
18631928 const elem_ty = tv.ty.elemType();
src/link/MachO.zig+1-1
......@@ -3877,7 +3877,7 @@ fn needsPointerRebase(ty: Type, val: Value) bool {
38773877 .Struct => {
38783878 const fields = ty.structFields().values();
38793879 if (fields.len == 0) return false;
3880 if (val.castTag(.@"struct")) |payload| {
3880 if (val.castTag(.aggregate)) |payload| {
38813881 const field_values = payload.data;
38823882 for (field_values) |field_val, i| {
38833883 if (needsPointerRebase(fields[i].ty, field_val)) return true;
src/type.zig+2
......@@ -3568,6 +3568,8 @@ pub const Type = extern union {
35683568 .const_slice_u8,
35693569 .const_slice,
35703570 .mut_slice,
3571 .tuple,
3572 .empty_struct_literal,
35713573 => return null,
35723574
35733575 .pointer => return self.castTag(.pointer).?.data.sentinel,
src/value.zig+54-90
......@@ -127,10 +127,6 @@ pub const Value = extern union {
127127 /// This value is repeated some number of times. The amount of times to repeat
128128 /// is stored externally.
129129 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,
134130 /// An array with length 0 but it has a sentinel.
135131 empty_array_sentinel,
136132 /// Pointer and length as sub `Value` objects.
......@@ -162,8 +158,11 @@ pub const Value = extern union {
162158 opt_payload,
163159 /// A pointer to the payload of an optional, based on a pointer to an optional.
164160 opt_payload_ptr,
165 /// An instance of a struct.
166 @"struct",
161 /// An instance of a struct, array, or vector.
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,
167166 /// An instance of a union.
168167 @"union",
169168 /// This is a special value that tracks a set of types that have been stored
......@@ -279,7 +278,6 @@ pub const Value = extern union {
279278 .enum_literal,
280279 => Payload.Bytes,
281280
282 .array => Payload.Array,
283281 .slice => Payload.Slice,
284282
285283 .enum_field_index => Payload.U32,
......@@ -301,7 +299,7 @@ pub const Value = extern union {
301299 .@"error" => Payload.Error,
302300 .inferred_alloc => Payload.InferredAlloc,
303301 .inferred_alloc_comptime => Payload.InferredAllocComptime,
304 .@"struct" => Payload.Struct,
302 .aggregate => Payload.Aggregate,
305303 .@"union" => Payload.Union,
306304 .bound_fn => Payload.BoundFn,
307305 };
......@@ -521,18 +519,6 @@ pub const Value = extern union {
521519 };
522520 return Value{ .ptr_otherwise = &new_payload.base };
523521 },
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 },
536522 .slice => {
537523 const payload = self.castTag(.slice).?;
538524 const new_payload = try arena.create(Payload.Slice);
......@@ -562,15 +548,15 @@ pub const Value = extern union {
562548 .enum_field_index => return self.copyPayloadShallow(arena, Payload.U32),
563549 .@"error" => return self.copyPayloadShallow(arena, Payload.Error),
564550
565 .@"struct" => {
566 const old_field_values = self.castTag(.@"struct").?.data;
567 const new_payload = try arena.create(Payload.Struct);
551 .aggregate => {
552 const payload = self.castTag(.aggregate).?;
553 const new_payload = try arena.create(Payload.Aggregate);
568554 new_payload.* = .{
569 .base = .{ .tag = .@"struct" },
570 .data = try arena.alloc(Value, old_field_values.len),
555 .base = payload.base,
556 .data = try arena.alloc(Value, payload.data.len),
571557 };
572 for (old_field_values) |old_field_val, i| {
573 new_payload.data[i] = try old_field_val.copy(arena);
558 for (new_payload.data) |*elem, i| {
559 elem.* = try payload.data[i].copy(arena);
574560 }
575561 return Value{ .ptr_otherwise = &new_payload.base };
576562 },
......@@ -677,8 +663,8 @@ pub const Value = extern union {
677663 .abi_align_default => return out_stream.writeAll("(default ABI alignment)"),
678664
679665 .empty_struct_value => return out_stream.writeAll("struct {}{}"),
680 .@"struct" => {
681 return out_stream.writeAll("(struct value)");
666 .aggregate => {
667 return out_stream.writeAll("(aggregate)");
682668 },
683669 .@"union" => {
684670 return out_stream.writeAll("(union value)");
......@@ -733,7 +719,6 @@ pub const Value = extern union {
733719 try out_stream.writeAll("(repeated) ");
734720 val = val.castTag(.repeated).?.data;
735721 },
736 .array => return out_stream.writeAll("(array)"),
737722 .empty_array_sentinel => return out_stream.writeAll("(empty array with sentinel)"),
738723 .slice => return out_stream.writeAll("(slice)"),
739724 .float_16 => return out_stream.print("{}", .{val.castTag(.float_16).?.data}),
......@@ -1087,7 +1072,7 @@ pub const Value = extern union {
10871072 .Auto => unreachable, // Sema is supposed to have emitted a compile error already
10881073 .Extern => {
10891074 const fields = ty.structFields().values();
1090 const field_vals = val.castTag(.@"struct").?.data;
1075 const field_vals = val.castTag(.aggregate).?.data;
10911076 for (fields) |field, i| {
10921077 const off = @intCast(usize, ty.structFieldOffset(i, target));
10931078 writeToMemory(field_vals[i], field.ty, target, buffer[off..]);
......@@ -1110,7 +1095,7 @@ pub const Value = extern union {
11101095 fn packedStructToInt(val: Value, ty: Type, target: Target, buf: []std.math.big.Limb) BigIntConst {
11111096 var bigint = BigIntMutable.init(buf, 0);
11121097 const fields = ty.structFields().values();
1113 const field_vals = val.castTag(.@"struct").?.data;
1098 const field_vals = val.castTag(.aggregate).?.data;
11141099 var bits: u16 = 0;
11151100 // TODO allocate enough heap space instead of using this buffer
11161101 // on the stack.
......@@ -1185,7 +1170,7 @@ pub const Value = extern union {
11851170 elem.* = try readFromMemory(elem_ty, target, buffer[offset..], arena);
11861171 offset += @intCast(usize, elem_size);
11871172 }
1188 return Tag.array.create(arena, elems);
1173 return Tag.aggregate.create(arena, elems);
11891174 },
11901175 .Struct => switch (ty.containerLayout()) {
11911176 .Auto => unreachable, // Sema is supposed to have emitted a compile error already
......@@ -1196,7 +1181,7 @@ pub const Value = extern union {
11961181 const off = @intCast(usize, ty.structFieldOffset(i, target));
11971182 field_vals[i] = try readFromMemory(field.ty, target, buffer[off..], arena);
11981183 }
1199 return Tag.@"struct".create(arena, field_vals);
1184 return Tag.aggregate.create(arena, field_vals);
12001185 },
12011186 .Packed => {
12021187 const endian = target.cpu.arch.endian();
......@@ -1250,7 +1235,7 @@ pub const Value = extern union {
12501235 else => unreachable,
12511236 };
12521237 }
1253 return Tag.@"struct".create(arena, field_vals);
1238 return Tag.aggregate.create(arena, field_vals);
12541239 }
12551240
12561241 fn bitCastBigIntToFloat(
......@@ -1827,9 +1812,9 @@ pub const Value = extern union {
18271812 assert(op == .eq);
18281813 return lhs.castTag(.repeated).?.data.compareWithZero(.eq);
18291814 },
1830 .array => {
1815 .aggregate => {
18311816 assert(op == .eq);
1832 for (lhs.cast(Payload.Array).?.data) |elem_val| {
1817 for (lhs.castTag(.aggregate).?.data) |elem_val| {
18331818 if (!elem_val.compareWithZero(.eq)) return false;
18341819 }
18351820 return true;
......@@ -1898,29 +1883,16 @@ pub const Value = extern union {
18981883 },
18991884 .eu_payload_ptr => @panic("TODO: Implement more pointer eql cases"),
19001885 .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 },
19151886 .function => {
19161887 const a_payload = a.castTag(.function).?.data;
19171888 const b_payload = b.castTag(.function).?.data;
19181889 return a_payload == b_payload;
19191890 },
1920 .@"struct" => {
1921 const a_field_vals = a.castTag(.@"struct").?.data;
1922 const b_field_vals = b.castTag(.@"struct").?.data;
1891 .aggregate => {
1892 const a_field_vals = a.castTag(.aggregate).?.data;
1893 const b_field_vals = b.castTag(.aggregate).?.data;
19231894 assert(a_field_vals.len == b_field_vals.len);
1895
19241896 if (ty.isTupleOrAnonStruct()) {
19251897 const types = ty.tupleFields().types;
19261898 assert(types.len == a_field_vals.len);
......@@ -1929,10 +1901,21 @@ pub const Value = extern union {
19291901 }
19301902 return true;
19311903 }
1932 const fields = ty.structFields().values();
1933 assert(fields.len == a_field_vals.len);
1934 for (fields) |field, i| {
1935 if (!eql(a_field_vals[i], b_field_vals[i], field.ty)) return false;
1904
1905 if (ty.zigTypeTag() == .Struct) {
1906 const fields = ty.structFields().values();
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;
19361919 }
19371920 return true;
19381921 },
......@@ -2002,7 +1985,7 @@ pub const Value = extern union {
20021985 },
20031986 .Struct => {
20041987 // A tuple can be represented with .empty_struct_value,
2005 // the_one_possible_value, .@"struct" in which case we could
1988 // the_one_possible_value, .aggregate in which case we could
20061989 // end up here and the values are equal if the type has zero fields.
20071990 return ty.structFieldCount() != 0;
20081991 },
......@@ -2072,8 +2055,8 @@ pub const Value = extern union {
20722055 field.default_val.hash(field.ty, hasher);
20732056 }
20742057 },
2075 .@"struct" => {
2076 const field_values = val.castTag(.@"struct").?.data;
2058 .aggregate => {
2059 const field_values = val.castTag(.aggregate).?.data;
20772060 for (field_values) |field_val, i| {
20782061 field_val.hash(fields[i].ty, hasher);
20792062 }
......@@ -2190,19 +2173,12 @@ pub const Value = extern union {
21902173 if (val.isComptimeMutablePtr()) return true;
21912174 switch (val.tag()) {
21922175 .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 },
22002176 .eu_payload => return val.castTag(.eu_payload).?.data.canMutateComptimeVarState(),
22012177 .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.canMutateComptimeVarState(),
22022178 .opt_payload => return val.castTag(.opt_payload).?.data.canMutateComptimeVarState(),
22032179 .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.canMutateComptimeVarState(),
2204 .@"struct" => {
2205 const fields = val.cast(Payload.Struct).?.data;
2180 .aggregate => {
2181 const fields = val.castTag(.aggregate).?.data;
22062182 for (fields) |field| {
22072183 if (field.canMutateComptimeVarState()) return true;
22082184 }
......@@ -2302,11 +2278,6 @@ pub const Value = extern union {
23022278 .empty_array_sentinel,
23032279 => 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 },
23102281 .slice => {
23112282 const slice = val.cast(Payload.Slice).?.data;
23122283 markReferencedDeclsAlive(slice.ptr);
......@@ -2321,8 +2292,8 @@ pub const Value = extern union {
23212292 const field_ptr = val.cast(Payload.FieldPtr).?.data;
23222293 return markReferencedDeclsAlive(field_ptr.container_ptr);
23232294 },
2324 .@"struct" => {
2325 for (val.cast(Payload.Struct).?.data) |field_val| {
2295 .aggregate => {
2296 for (val.castTag(.aggregate).?.data) |field_val| {
23262297 markReferencedDeclsAlive(field_val);
23272298 }
23282299 },
......@@ -2405,7 +2376,7 @@ pub const Value = extern union {
24052376 // No matter the index; all the elements are the same!
24062377 .repeated => return val.castTag(.repeated).?.data,
24072378
2408 .array => return val.castTag(.array).?.data[index],
2379 .aggregate => return val.castTag(.aggregate).?.data[index],
24092380 .slice => return val.castTag(.slice).?.data.ptr.elemValueAdvanced(index, arena, buffer),
24102381
24112382 .decl_ref => return val.castTag(.decl_ref).?.data.val.elemValueAdvanced(index, arena, buffer),
......@@ -2426,8 +2397,8 @@ pub const Value = extern union {
24262397 pub fn fieldValue(val: Value, allocator: Allocator, index: usize) error{OutOfMemory}!Value {
24272398 _ = allocator;
24282399 switch (val.tag()) {
2429 .@"struct" => {
2430 const field_values = val.castTag(.@"struct").?.data;
2400 .aggregate => {
2401 const field_values = val.castTag(.aggregate).?.data;
24312402 return field_values[index];
24322403 },
24332404 .@"union" => {
......@@ -4199,8 +4170,10 @@ pub const Value = extern union {
41994170 data: []const u8,
42004171 };
42014172
4202 pub const Array = struct {
4173 pub const Aggregate = struct {
42034174 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.
42044177 data: []Value,
42054178 };
42064179
......@@ -4298,15 +4271,6 @@ pub const Value = extern union {
42984271 },
42994272 };
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
43104274 pub const Union = struct {
43114275 pub const base_tag = Tag.@"union";
43124276
test/behavior/tuple.zig+5-1
......@@ -129,7 +129,11 @@ test "tuple initializer for var" {
129129}
130130
131131test "array-like initializer for tuple types" {
132 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
132 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
134138 const T = @Type(.{
135139 .Struct = .{