authorgravatar for der.teufel.mail@gmail.comKrzysztof Wolicki <der.teufel.mail@gmail.com> 2026-04-30 14:48:37+02:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-05-27 09:19:51+01:00
log5ed8e9324e77d0c94d7f5ad80025aa22f4a2eea8
treece7a8285f29989668f8d701459c3a6cc074e32f7
parent284ab0ad86310df45ecc3887cb6ed2f8cf507e45
signaturelock-open Commit is signed but in an unrecognized format.

Sema: generate new struct-of-arrays style values in zirTypeInfo


2 files changed, 414 insertions(+), 176 deletions(-)

src/Sema.zig+405-157
...@@ -2822,6 +2822,17 @@ fn interpretStdLangType(...@@ -2822,6 +2822,17 @@ fn interpretStdLangType(
2822 };2822 };
2823}2823}
28242824
2825fn uninterpretStdLangType(
2826 sema: *Sema,
2827 val: anytype,
2828 ty: Type,
2829) !Value {
2830 return Value.uninterpret(val, ty, sema.pt) catch |err| switch (err) {
2831 error.OutOfMemory => |e| return e,
2832 error.TypeMismatch => @panic("std.lang is corrupt"),
2833 };
2834}
2835
2825fn zirTupleDecl(2836fn zirTupleDecl(
2826 sema: *Sema,2837 sema: *Sema,
2827 block: *Block,2838 block: *Block,
...@@ -15988,13 +15999,19 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -15988,13 +15999,19 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1598815999
15989 .@"fn" => {16000 .@"fn" => {
15990 const fn_info_ty = try sema.getStdLangType(src, .@"Type.Fn");16001 const fn_info_ty = try sema.getStdLangType(src, .@"Type.Fn");
15991 const param_info_ty = try sema.getStdLangType(src, .@"Type.Fn.Param");16002 const param_attrs_ty = try sema.getStdLangType(src, .@"Type.Fn.ParamAttributes");
16003 const fn_attr_ty = try sema.getStdLangType(src, .@"Type.Fn.Attributes");
1599216004
15993 const func_ty_info = zcu.typeToFunc(ty).?;16005 const func_ty_info = zcu.typeToFunc(ty).?;
15994 const param_vals = try sema.arena.alloc(InternPool.Index, func_ty_info.param_types.len);16006 const param_type_vals = try sema.arena.alloc(InternPool.Index, func_ty_info.param_types.len);
16007 const param_attr_vals = try sema.arena.alloc(InternPool.Index, func_ty_info.param_types.len);
15995 var func_is_generic = false;16008 var func_is_generic = false;
1599616009
15997 for (param_vals, 0..) |*param_val, param_index| {16010 for (
16011 param_type_vals,
16012 param_attr_vals,
16013 0..,
16014 ) |*param_type_val, *param_attr_val, param_index| {
15998 const param_ty = func_ty_info.param_types.get(ip)[param_index];16015 const param_ty = func_ty_info.param_types.get(ip)[param_index];
15999 const is_generic = param_ty == .generic_poison_type;16016 const is_generic = param_ty == .generic_poison_type;
16000 const is_noalias, const is_comptime = flags: {16017 const is_noalias, const is_comptime = flags: {
...@@ -16011,25 +16028,23 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16011,25 +16028,23 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16011 .val = if (is_generic) .none else param_ty,16028 .val = if (is_generic) .none else param_ty,
16012 } });16029 } });
1601316030
16014 const param_fields = .{16031 const param_attrs_fields = .{
16015 // is_generic: bool,16032 // @"noalias": bool,
16016 Value.makeBool(is_generic).toIntern(),
16017 // is_noalias: bool,
16018 Value.makeBool(is_noalias).toIntern(),16033 Value.makeBool(is_noalias).toIntern(),
16019 // type: ?type,
16020 param_ty_val,
16021 };16034 };
16022 param_val.* = (try pt.aggregateValue(param_info_ty, &param_fields)).toIntern();16035
16036 param_type_val.* = param_ty_val;
16037 param_attr_val.* = (try pt.aggregateValue(param_attrs_ty, &param_attrs_fields)).toIntern();
16023 }16038 }
1602416039
16025 const args_val = v: {16040 const param_types_val = v: {
16026 const new_decl_ty = try pt.arrayType(.{16041 const new_decl_ty = try pt.arrayType(.{
16027 .len = param_vals.len,16042 .len = param_type_vals.len,
16028 .child = param_info_ty.toIntern(),16043 .child = try pt.intern(.{ .opt_type = .type_type }),
16029 });16044 });
16030 const new_decl_val = (try pt.aggregateValue(new_decl_ty, param_vals)).toIntern();16045 const new_decl_val = (try pt.aggregateValue(new_decl_ty, param_type_vals)).toIntern();
16031 const slice_ty = (try pt.ptrType(.{16046 const slice_ty = (try pt.ptrType(.{
16032 .child = param_info_ty.toIntern(),16047 .child = try pt.intern(.{ .opt_type = .type_type }),
16033 .flags = .{16048 .flags = .{
16034 .size = .slice,16049 .size = .slice,
16035 .is_const = true,16050 .is_const = true,
...@@ -16046,7 +16061,34 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16046,7 +16061,34 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16046 } },16061 } },
16047 .byte_offset = 0,16062 .byte_offset = 0,
16048 } }),16063 } }),
16049 .len = (try pt.intValue(.usize, param_vals.len)).toIntern(),16064 .len = (try pt.intValue(.usize, param_type_vals.len)).toIntern(),
16065 } });
16066 };
16067 const param_attrs_val = v: {
16068 const new_decl_ty = try pt.arrayType(.{
16069 .len = param_attr_vals.len,
16070 .child = param_attrs_ty.toIntern(),
16071 });
16072 const new_decl_val = (try pt.aggregateValue(new_decl_ty, param_attr_vals)).toIntern();
16073 const slice_ty = (try pt.ptrType(.{
16074 .child = param_attrs_ty.toIntern(),
16075 .flags = .{
16076 .size = .slice,
16077 .is_const = true,
16078 },
16079 })).toIntern();
16080 const manyptr_ty = Type.fromInterned(slice_ty).slicePtrFieldType(zcu).toIntern();
16081 break :v try pt.intern(.{ .slice = .{
16082 .ty = slice_ty,
16083 .ptr = try pt.intern(.{ .ptr = .{
16084 .ty = manyptr_ty,
16085 .base_addr = .{ .uav = .{
16086 .orig_ty = manyptr_ty,
16087 .val = new_decl_val,
16088 } },
16089 .byte_offset = 0,
16090 } }),
16091 .len = (try pt.intValue(.usize, param_attr_vals.len)).toIntern(),
16050 } });16092 } });
16051 };16093 };
1605216094
...@@ -16075,17 +16117,25 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16075,17 +16117,25 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16075 error.OutOfMemory => |e| return e,16117 error.OutOfMemory => |e| return e,
16076 };16118 };
1607716119
16078 const field_values: [5]InternPool.Index = .{16120 const fn_attrs_values = .{
16079 // calling_convention: CallingConvention,16121 // @"callconv": CallingConvention = .auto,
16080 callconv_val.toIntern(),16122 callconv_val.toIntern(),
16123 // varargs: bool = false,
16124 Value.makeBool(func_ty_info.is_var_args).toIntern(),
16125 };
16126
16127 const field_values = .{
16128 // attrs: Attributes,
16129 (try pt.aggregateValue(fn_attr_ty, &fn_attrs_values)).toIntern(),
16081 // is_generic: bool,16130 // is_generic: bool,
16082 Value.makeBool(func_is_generic).toIntern(),16131 Value.makeBool(func_is_generic).toIntern(),
16083 // is_var_args: bool,
16084 Value.makeBool(func_ty_info.is_var_args).toIntern(),
16085 // return_type: ?type,16132 // return_type: ?type,
16086 ret_ty_opt,16133 ret_ty_opt,
16087 // args: []const Fn.Param,16134
16088 args_val,16135 // param_types: []const ?type,
16136 param_types_val,
16137 // param_attrs: []const ParamAttributes,
16138 param_attrs_val,
16089 };16139 };
16090 return Air.internedToRef((try pt.internUnion(.{16140 return Air.internedToRef((try pt.internUnion(.{
16091 .ty = type_info_ty.toIntern(),16141 .ty = type_info_ty.toIntern(),
...@@ -16139,23 +16189,34 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16139,23 +16189,34 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16139 const addrspace_ty = try sema.getStdLangType(src, .AddressSpace);16189 const addrspace_ty = try sema.getStdLangType(src, .AddressSpace);
16140 const pointer_ty = try sema.getStdLangType(src, .@"Type.Pointer");16190 const pointer_ty = try sema.getStdLangType(src, .@"Type.Pointer");
16141 const ptr_size_ty = try sema.getStdLangType(src, .@"Type.Pointer.Size");16191 const ptr_size_ty = try sema.getStdLangType(src, .@"Type.Pointer.Size");
16192 const ptr_attrs_ty = try sema.getStdLangType(src, .@"Type.Pointer.Attributes");
1614216193
16143 const field_values = .{16194 const opt_addrspace_val = try pt.intern(.{ .opt = .{
16144 // size: Size,16195 .ty = (try pt.optionalType(addrspace_ty.toIntern())).toIntern(),
16145 (try pt.enumValueFieldIndex(ptr_size_ty, @intFromEnum(info.flags.size))).toIntern(),16196 .val = (try sema.uninterpretStdLangType(info.flags.address_space, addrspace_ty)).toIntern(),
16146 // is_const: bool,16197 } });
16198
16199 const attributes = .{
16200 // @"const": bool = false,
16147 Value.makeBool(info.flags.is_const).toIntern(),16201 Value.makeBool(info.flags.is_const).toIntern(),
16148 // is_volatile: bool,16202 // @"volatile": bool = false,
16149 Value.makeBool(info.flags.is_volatile).toIntern(),16203 Value.makeBool(info.flags.is_volatile).toIntern(),
16150 // alignment: ?usize,16204 // @"allowzero": bool = false,
16205 Value.makeBool(info.flags.is_allowzero).toIntern(),
16206 // @"addrspace": ?AddressSpace = null,
16207 opt_addrspace_val,
16208 // @"align": ?usize = null,
16151 alignment_val.toIntern(),16209 alignment_val.toIntern(),
16152 // address_space: AddressSpace16210 };
16153 (try pt.enumValueFieldIndex(addrspace_ty, @intFromEnum(info.flags.address_space))).toIntern(),16211
16212 const field_values = .{
16213 // size: Size,
16214 (try pt.enumValueFieldIndex(ptr_size_ty, @intFromEnum(info.flags.size))).toIntern(),
16215 // attrs: Attributes
16216 (try pt.aggregateValue(ptr_attrs_ty, &attributes)).toIntern(),
16154 // child: type,16217 // child: type,
16155 info.child,16218 info.child,
16156 // is_allowzero: bool,16219 // sentinel_ptr: ?*const anyopaque,
16157 Value.makeBool(info.flags.is_allowzero).toIntern(),
16158 // sentinel: ?*const anyopaque,
16159 (try sema.optRefValue(switch (info.sentinel) {16220 (try sema.optRefValue(switch (info.sentinel) {
16160 .none => null,16221 .none => null,
16161 else => Value.fromInterned(info.sentinel),16222 else => Value.fromInterned(info.sentinel),
...@@ -16215,8 +16276,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16215,8 +16276,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16215 })));16276 })));
16216 },16277 },
16217 .error_set => {16278 .error_set => {
16218 // Get the Error type16279 const error_set_ty = try sema.getStdLangType(src, .@"Type.ErrorSet");
16219 const error_field_ty = try sema.getStdLangType(src, .@"Type.Error");
1622016280
16221 // Build our list of Error values16281 // Build our list of Error values
16222 // Optional value is only null if anyerror16282 // Optional value is only null if anyerror
...@@ -16253,20 +16313,16 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16253,20 +16313,16 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16253 } });16313 } });
16254 };16314 };
1625516315
16256 const error_field_fields = .{16316 field_val.* = error_name_val;
16257 // name: [:0]const u8,
16258 error_name_val,
16259 };
16260 field_val.* = (try pt.aggregateValue(error_field_ty, &error_field_fields)).toIntern();
16261 }16317 }
1626216318
16263 break :blk vals;16319 break :blk vals;
16264 },16320 },
16265 };16321 };
1626616322
16267 // Build our ?[]const Error value16323 // Build our ?[]const [:0]const u8 value
16268 const slice_errors_ty = try pt.ptrType(.{16324 const slice_errors_ty = try pt.ptrType(.{
16269 .child = error_field_ty.toIntern(),16325 .child = .slice_const_u8_sentinel_0_type,
16270 .flags = .{16326 .flags = .{
16271 .size = .slice,16327 .size = .slice,
16272 .is_const = true,16328 .is_const = true,
...@@ -16276,7 +16332,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16276,7 +16332,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16276 const errors_payload_val: InternPool.Index = if (error_field_vals) |vals| v: {16332 const errors_payload_val: InternPool.Index = if (error_field_vals) |vals| v: {
16277 const array_errors_ty = try pt.arrayType(.{16333 const array_errors_ty = try pt.arrayType(.{
16278 .len = vals.len,16334 .len = vals.len,
16279 .child = error_field_ty.toIntern(),16335 .child = .slice_const_u8_sentinel_0_type,
16280 });16336 });
16281 const new_decl_val = (try pt.aggregateValue(array_errors_ty, vals)).toIntern();16337 const new_decl_val = (try pt.aggregateValue(array_errors_ty, vals)).toIntern();
16282 const manyptr_errors_ty = slice_errors_ty.slicePtrFieldType(zcu).toIntern();16338 const manyptr_errors_ty = slice_errors_ty.slicePtrFieldType(zcu).toIntern();
...@@ -16298,11 +16354,16 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16298,11 +16354,16 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16298 .val = errors_payload_val,16354 .val = errors_payload_val,
16299 } });16355 } });
1630016356
16357 const field_values = .{
16358 // error_names: ?[]const [:0]const u8
16359 errors_val,
16360 };
16361
16301 // Construct Type{ .error_set = errors_val }16362 // Construct Type{ .error_set = errors_val }
16302 return Air.internedToRef((try pt.internUnion(.{16363 return Air.internedToRef((try pt.internUnion(.{
16303 .ty = type_info_ty.toIntern(),16364 .ty = type_info_ty.toIntern(),
16304 .tag = (try pt.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.lang.TypeId.error_set))).toIntern(),16365 .tag = (try pt.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.lang.TypeId.error_set))).toIntern(),
16305 .val = errors_val,16366 .val = (try pt.aggregateValue(error_set_ty, &field_values)).toIntern(),
16306 })));16367 })));
16307 },16368 },
16308 .error_union => {16369 .error_union => {
...@@ -16322,12 +16383,20 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16322,12 +16383,20 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16322 },16383 },
16323 .@"enum" => {16384 .@"enum" => {
16324 const enum_obj = ip.loadEnumType(ty.toIntern());16385 const enum_obj = ip.loadEnumType(ty.toIntern());
16325 const is_exhaustive: Value = .makeBool(!enum_obj.nonexhaustive);
1632616386
16327 const enum_field_ty = try sema.getStdLangType(src, .@"Type.EnumField");16387 const enum_mode_ty = try sema.getStdLangType(src, .@"Type.Enum.Mode");
1632816388
16329 const enum_field_vals = try sema.arena.alloc(InternPool.Index, enum_obj.field_names.len);16389 const enum_mode_tag: std.builtin.Type.Enum.Mode = if (enum_obj.nonexhaustive) .nonexhaustive else .exhaustive;
16330 for (enum_field_vals, 0..) |*field_val, tag_index| {16390
16391 const enum_mode: Value = try sema.uninterpretStdLangType(enum_mode_tag, enum_mode_ty);
16392
16393 const enum_field_name_vals = try sema.arena.alloc(InternPool.Index, enum_obj.field_names.len);
16394 const enum_field_value_vals = try sema.arena.alloc(InternPool.Index, enum_obj.field_names.len);
16395 for (
16396 enum_field_name_vals,
16397 enum_field_value_vals,
16398 0..,
16399 ) |*field_name_val, *field_value_val, tag_index| {
16331 const value_val = if (enum_obj.field_values.len > 0)16400 const value_val = if (enum_obj.field_values.len > 0)
16332 try ip.getCoercedInts(16401 try ip.getCoercedInts(
16333 gpa,16402 gpa,
...@@ -16366,23 +16435,18 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16366,23 +16435,18 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16366 } });16435 } });
16367 };16436 };
1636816437
16369 const enum_field_fields = .{16438 field_name_val.* = name_val;
16370 // name: [:0]const u8,16439 field_value_val.* = value_val;
16371 name_val,
16372 // value: comptime_int,
16373 value_val,
16374 };
16375 field_val.* = (try pt.aggregateValue(enum_field_ty, &enum_field_fields)).toIntern();
16376 }16440 }
1637716441
16378 const fields_val = v: {16442 const fields_names_val = v: {
16379 const fields_array_ty = try pt.arrayType(.{16443 const fields_names_array_ty = try pt.arrayType(.{
16380 .len = enum_field_vals.len,16444 .len = enum_field_name_vals.len,
16381 .child = enum_field_ty.toIntern(),16445 .child = .slice_const_u8_sentinel_0_type,
16382 });16446 });
16383 const new_decl_val = (try pt.aggregateValue(fields_array_ty, enum_field_vals)).toIntern();16447 const new_decl_val = (try pt.aggregateValue(fields_names_array_ty, enum_field_name_vals)).toIntern();
16384 const slice_ty = (try pt.ptrType(.{16448 const slice_ty = (try pt.ptrType(.{
16385 .child = enum_field_ty.toIntern(),16449 .child = .slice_const_u8_sentinel_0_type,
16386 .flags = .{16450 .flags = .{
16387 .size = .slice,16451 .size = .slice,
16388 .is_const = true,16452 .is_const = true,
...@@ -16399,23 +16463,55 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16399,23 +16463,55 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16399 } },16463 } },
16400 .byte_offset = 0,16464 .byte_offset = 0,
16401 } }),16465 } }),
16402 .len = (try pt.intValue(.usize, enum_field_vals.len)).toIntern(),16466 .len = (try pt.intValue(.usize, enum_field_name_vals.len)).toIntern(),
16403 } });16467 } });
16404 };16468 };
1640516469
16406 const decls_val = try sema.typeInfoDecls(src, ip.loadEnumType(ty.toIntern()).namespace.toOptional());16470 const fields_values_val = v: {
16471 const fields_values_array_ty = try pt.arrayType(.{
16472 .len = enum_field_value_vals.len,
16473 .child = .comptime_int_type,
16474 });
16475 const new_decl_val = (try pt.aggregateValue(fields_values_array_ty, enum_field_value_vals)).toIntern();
16476 const slice_ty = (try pt.ptrType(.{
16477 .child = .comptime_int_type,
16478 .flags = .{
16479 .size = .slice,
16480 .is_const = true,
16481 },
16482 })).toIntern();
16483 const manyptr_ty = Type.fromInterned(slice_ty).slicePtrFieldType(zcu).toIntern();
16484 break :v try pt.intern(.{ .slice = .{
16485 .ty = slice_ty,
16486 .ptr = try pt.intern(.{ .ptr = .{
16487 .ty = manyptr_ty,
16488 .base_addr = .{ .uav = .{
16489 .val = new_decl_val,
16490 .orig_ty = manyptr_ty,
16491 } },
16492 .byte_offset = 0,
16493 } }),
16494 .len = (try pt.intValue(.usize, enum_field_value_vals.len)).toIntern(),
16495 } });
16496 };
16497
16498 const decl_names_val = try sema.typeInfoDecls(ip.loadEnumType(ty.toIntern()).namespace.toOptional());
1640716499
16408 const type_enum_ty = try sema.getStdLangType(src, .@"Type.Enum");16500 const type_enum_ty = try sema.getStdLangType(src, .@"Type.Enum");
1640916501
16410 const field_values = .{16502 const field_values = .{
16411 // tag_type: type,16503 // tag_type: type,
16412 ip.loadEnumType(ty.toIntern()).int_tag_type,16504 ip.loadEnumType(ty.toIntern()).int_tag_type,
16413 // fields: []const EnumField,16505 // mode: Mode
16414 fields_val,16506 enum_mode.toIntern(),
16415 // decls: []const Declaration,16507
16416 decls_val,16508 // field_names: []const [:0]const u8,
16417 // is_exhaustive: bool,16509 fields_names_val,
16418 is_exhaustive.toIntern(),16510 // field_values: []const comptime_int,
16511 fields_values_val,
16512
16513 // decl_names: []const [:0]const u8,
16514 decl_names_val,
16419 };16515 };
16420 return Air.internedToRef((try pt.internUnion(.{16516 return Air.internedToRef((try pt.internUnion(.{
16421 .ty = type_info_ty.toIntern(),16517 .ty = type_info_ty.toIntern(),
...@@ -16425,16 +16521,26 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16425,16 +16521,26 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16425 },16521 },
16426 .@"union" => {16522 .@"union" => {
16427 const type_union_ty = try sema.getStdLangType(src, .@"Type.Union");16523 const type_union_ty = try sema.getStdLangType(src, .@"Type.Union");
16428 const union_field_ty = try sema.getStdLangType(src, .@"Type.UnionField");16524 const union_field_attr_ty = try sema.getStdLangType(src, .@"Type.Union.FieldAttributes");
1642916525
16430 const union_obj = ip.loadUnionType(ty.toIntern());16526 const union_obj = ip.loadUnionType(ty.toIntern());
16431 const enum_obj = ip.loadEnumType(union_obj.enum_tag_type);16527 const enum_obj = ip.loadEnumType(union_obj.enum_tag_type);
16432 const layout = union_obj.layout;16528 const layout = union_obj.layout;
1643316529
16434 const union_field_vals = try gpa.alloc(InternPool.Index, enum_obj.field_names.len);16530 const union_field_names = try gpa.alloc(InternPool.Index, enum_obj.field_names.len);
16435 defer gpa.free(union_field_vals);16531 defer gpa.free(union_field_names);
1643616532 const union_field_attrs = try gpa.alloc(InternPool.Index, enum_obj.field_names.len);
16437 for (union_field_vals, 0..) |*field_val, field_index| {16533 defer gpa.free(union_field_attrs);
16534
16535 for (
16536 union_field_names,
16537 union_field_attrs,
16538 0..,
16539 ) |
16540 *field_name_val,
16541 *field_attr_val,
16542 field_index,
16543 | {
16438 const name_val = v: {16544 const name_val = v: {
16439 const field_name = enum_obj.field_names.get(ip)[field_index];16545 const field_name = enum_obj.field_names.get(ip)[field_index];
16440 const field_name_len = field_name.length(ip);16546 const field_name_len = field_name.length(ip);
...@@ -16461,8 +16567,6 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16461,8 +16567,6 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16461 } });16567 } });
16462 };16568 };
1646316569
16464 const field_ty: Type = .fromInterned(union_obj.field_types.get(ip)[field_index]);
16465
16466 const alignment_ty = try pt.optionalType(.usize_type);16570 const alignment_ty = try pt.optionalType(.usize_type);
16467 const alignment_val: Value = val: {16571 const alignment_val: Value = val: {
16468 const a: Alignment = switch (layout) {16572 const a: Alignment = switch (layout) {
...@@ -16479,25 +16583,52 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16479,25 +16583,52 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16479 } }));16583 } }));
16480 };16584 };
1648116585
16482 const union_field_fields = .{16586 field_name_val.* = name_val;
16483 // name: [:0]const u8,16587 const union_field_attr = .{
16484 name_val,
16485 // type: type,
16486 field_ty.toIntern(),
16487 // alignment: ?usize,16588 // alignment: ?usize,
16488 alignment_val.toIntern(),16589 alignment_val.toIntern(),
16489 };16590 };
16490 field_val.* = (try pt.aggregateValue(union_field_ty, &union_field_fields)).toIntern();16591
16592 field_attr_val.* = (try pt.aggregateValue(union_field_attr_ty, &union_field_attr)).toIntern();
16491 }16593 }
1649216594
16493 const fields_val = v: {16595 const field_names_val = v: {
16596 const array_field_names_ty = try pt.arrayType(.{
16597 .len = union_field_names.len,
16598 .child = .slice_const_u8_sentinel_0_type,
16599 });
16600 const new_decl_val = (try pt.aggregateValue(array_field_names_ty, union_field_names)).toIntern();
16601 const slice_ty = (try pt.ptrType(.{
16602 .child = .slice_const_u8_sentinel_0_type,
16603 .flags = .{
16604 .size = .slice,
16605 .is_const = true,
16606 },
16607 })).toIntern();
16608 const manyptr_ty = Type.fromInterned(slice_ty).slicePtrFieldType(zcu).toIntern();
16609 break :v try pt.intern(.{ .slice = .{
16610 .ty = slice_ty,
16611 .ptr = try pt.intern(.{ .ptr = .{
16612 .ty = manyptr_ty,
16613 .base_addr = .{ .uav = .{
16614 .orig_ty = manyptr_ty,
16615 .val = new_decl_val,
16616 } },
16617 .byte_offset = 0,
16618 } }),
16619 .len = (try pt.intValue(.usize, union_field_names.len)).toIntern(),
16620 } });
16621 };
16622 const field_types_val = v: {
16623 const union_field_types = union_obj.field_types.get(ip);
16624
16494 const array_fields_ty = try pt.arrayType(.{16625 const array_fields_ty = try pt.arrayType(.{
16495 .len = union_field_vals.len,16626 .len = union_field_types.len,
16496 .child = union_field_ty.toIntern(),16627 .child = .type_type,
16497 });16628 });
16498 const new_decl_val = (try pt.aggregateValue(array_fields_ty, union_field_vals)).toIntern();16629 const new_decl_val = (try pt.aggregateValue(array_fields_ty, union_field_types)).toIntern();
16499 const slice_ty = (try pt.ptrType(.{16630 const slice_ty = (try pt.ptrType(.{
16500 .child = union_field_ty.toIntern(),16631 .child = .type_type,
16501 .flags = .{16632 .flags = .{
16502 .size = .slice,16633 .size = .slice,
16503 .is_const = true,16634 .is_const = true,
...@@ -16514,11 +16645,38 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16514,11 +16645,38 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16514 } },16645 } },
16515 .byte_offset = 0,16646 .byte_offset = 0,
16516 } }),16647 } }),
16517 .len = (try pt.intValue(.usize, union_field_vals.len)).toIntern(),16648 .len = (try pt.intValue(.usize, union_field_types.len)).toIntern(),
16649 } });
16650 };
16651 const field_attrs_val = v: {
16652 const array_fields_ty = try pt.arrayType(.{
16653 .len = union_field_attrs.len,
16654 .child = union_field_attr_ty.toIntern(),
16655 });
16656 const new_decl_val = (try pt.aggregateValue(array_fields_ty, union_field_attrs)).toIntern();
16657 const slice_ty = (try pt.ptrType(.{
16658 .child = union_field_attr_ty.toIntern(),
16659 .flags = .{
16660 .size = .slice,
16661 .is_const = true,
16662 },
16663 })).toIntern();
16664 const manyptr_ty = Type.fromInterned(slice_ty).slicePtrFieldType(zcu).toIntern();
16665 break :v try pt.intern(.{ .slice = .{
16666 .ty = slice_ty,
16667 .ptr = try pt.intern(.{ .ptr = .{
16668 .ty = manyptr_ty,
16669 .base_addr = .{ .uav = .{
16670 .orig_ty = manyptr_ty,
16671 .val = new_decl_val,
16672 } },
16673 .byte_offset = 0,
16674 } }),
16675 .len = (try pt.intValue(.usize, union_field_attrs.len)).toIntern(),
16518 } });16676 } });
16519 };16677 };
1652016678
16521 const decls_val = try sema.typeInfoDecls(src, ty.getNamespaceIndex(zcu).toOptional());16679 const decl_names_val = try sema.typeInfoDecls(ty.getNamespaceIndex(zcu).toOptional());
1652216680
16523 const enum_tag_ty_val = try pt.intern(.{ .opt = .{16681 const enum_tag_ty_val = try pt.intern(.{ .opt = .{
16524 .ty = (try pt.optionalType(.type_type)).toIntern(),16682 .ty = (try pt.optionalType(.type_type)).toIntern(),
...@@ -16527,16 +16685,32 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16527,16 +16685,32 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1652716685
16528 const container_layout_ty = try sema.getStdLangType(src, .@"Type.ContainerLayout");16686 const container_layout_ty = try sema.getStdLangType(src, .@"Type.ContainerLayout");
1652916687
16688 const backing_integer_val = try pt.intern(.{ .opt = .{
16689 .ty = (try pt.optionalType(.type_type)).toIntern(),
16690 .val = if (layout == .@"packed") val: {
16691 assert(Type.fromInterned(union_obj.packed_backing_int_type).isInt(zcu));
16692 break :val union_obj.packed_backing_int_type;
16693 } else .none,
16694 } });
16695
16530 const field_values = .{16696 const field_values = .{
16531 // layout: ContainerLayout,16697 // layout: ContainerLayout,
16532 (try pt.enumValueFieldIndex(container_layout_ty, @intFromEnum(layout))).toIntern(),16698 (try pt.enumValueFieldIndex(container_layout_ty, @intFromEnum(layout))).toIntern(),
1653316699
16534 // tag_type: ?type,16700 // tag_type: ?type,
16535 enum_tag_ty_val,16701 enum_tag_ty_val,
16536 // fields: []const UnionField,16702 // backing_integer: ?type,
16537 fields_val,16703 backing_integer_val,
16538 // decls: []const Declaration,16704
16539 decls_val,16705 // field_names: []const [:0]const u8,
16706 field_names_val,
16707 // field_types: []const type,
16708 field_types_val,
16709 // field_attrs: []const FieldAttributes,
16710 field_attrs_val,
16711
16712 // decl_names: []const [:0]const u8,
16713 decl_names_val,
16540 };16714 };
16541 return Air.internedToRef((try pt.internUnion(.{16715 return Air.internedToRef((try pt.internUnion(.{
16542 .ty = type_info_ty.toIntern(),16716 .ty = type_info_ty.toIntern(),
...@@ -16546,16 +16720,26 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16546,16 +16720,26 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16546 },16720 },
16547 .@"struct" => {16721 .@"struct" => {
16548 const type_struct_ty = try sema.getStdLangType(src, .@"Type.Struct");16722 const type_struct_ty = try sema.getStdLangType(src, .@"Type.Struct");
16549 const struct_field_ty = try sema.getStdLangType(src, .@"Type.StructField");16723 const struct_field_attr_ty = try sema.getStdLangType(src, .@"Type.Struct.FieldAttributes");
1655016724
16551 var struct_field_vals: []InternPool.Index = &.{};16725 var struct_field_name_vals: []InternPool.Index = &.{};
16552 defer gpa.free(struct_field_vals);16726 defer gpa.free(struct_field_name_vals);
16727 var struct_field_attr_vals: []InternPool.Index = &.{};
16728 defer gpa.free(struct_field_attr_vals);
16553 fv: {16729 fv: {
16554 const struct_type = switch (ip.indexToKey(ty.toIntern())) {16730 const struct_type = switch (ip.indexToKey(ty.toIntern())) {
16555 .tuple_type => |tuple_type| {16731 .tuple_type => |tuple_type| {
16556 struct_field_vals = try gpa.alloc(InternPool.Index, tuple_type.types.len);16732 struct_field_name_vals = try gpa.alloc(InternPool.Index, tuple_type.types.len);
16557 for (struct_field_vals, 0..) |*struct_field_val, field_index| {16733 struct_field_attr_vals = try gpa.alloc(InternPool.Index, tuple_type.types.len);
16558 const field_ty = tuple_type.types.get(ip)[field_index];16734 for (
16735 struct_field_name_vals,
16736 struct_field_attr_vals,
16737 0..,
16738 ) |
16739 *struct_field_name_val,
16740 *struct_field_attr_val,
16741 field_index,
16742 | {
16559 const field_val = tuple_type.values.get(ip)[field_index];16743 const field_val = tuple_type.values.get(ip)[field_index];
16560 const name_val = v: {16744 const name_val = v: {
16561 const field_name = try ip.getOrPutStringFmt(gpa, io, pt.tid, "{d}", .{field_index}, .no_embedded_nulls);16745 const field_name = try ip.getOrPutStringFmt(gpa, io, pt.tid, "{d}", .{field_index}, .no_embedded_nulls);
...@@ -16587,19 +16771,17 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16587,19 +16771,17 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16587 const opt_default_val = if (is_comptime) Value.fromInterned(field_val) else null;16771 const opt_default_val = if (is_comptime) Value.fromInterned(field_val) else null;
16588 const default_val_ptr = try sema.optRefValue(opt_default_val);16772 const default_val_ptr = try sema.optRefValue(opt_default_val);
1658916773
16590 const struct_field_fields = .{16774 const struct_field_attr_fields = .{
16591 // name: [:0]const u8,16775 // @"comptime": bool,
16592 name_val,
16593 // type: type,
16594 field_ty,
16595 // default_value: ?*const anyopaque,
16596 default_val_ptr.toIntern(),
16597 // is_comptime: bool,
16598 Value.makeBool(is_comptime).toIntern(),16776 Value.makeBool(is_comptime).toIntern(),
16599 // alignment: ?usize,16777 // @"align": ?usize,
16600 (try pt.nullValue(try pt.optionalType(.usize_type))).toIntern(),16778 (try pt.nullValue(try pt.optionalType(.usize_type))).toIntern(),
16779 // default_value_ptr: ?*const anyopaque,
16780 default_val_ptr.toIntern(),
16601 };16781 };
16602 struct_field_val.* = (try pt.aggregateValue(struct_field_ty, &struct_field_fields)).toIntern();16782
16783 struct_field_name_val.* = name_val;
16784 struct_field_attr_val.* = (try pt.aggregateValue(struct_field_attr_ty, &struct_field_attr_fields)).toIntern();
16603 }16785 }
16604 break :fv;16786 break :fv;
16605 },16787 },
...@@ -16607,12 +16789,20 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16607,12 +16789,20 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16607 else => unreachable,16789 else => unreachable,
16608 };16790 };
16609 try sema.ensureStructDefaultsResolved(ty, src); // can't do this sooner, since it's not allowed on tuples16791 try sema.ensureStructDefaultsResolved(ty, src); // can't do this sooner, since it's not allowed on tuples
16610 struct_field_vals = try gpa.alloc(InternPool.Index, struct_type.field_types.len);16792 struct_field_name_vals = try gpa.alloc(InternPool.Index, struct_type.field_types.len);
1661116793 struct_field_attr_vals = try gpa.alloc(InternPool.Index, struct_type.field_types.len);
16612 for (struct_field_vals, 0..) |*field_val, field_index| {16794
16795 for (
16796 struct_field_name_vals,
16797 struct_field_attr_vals,
16798 0..,
16799 ) |
16800 *field_name_val,
16801 *field_attr_val,
16802 field_index,
16803 | {
16613 const field_name = struct_type.field_names.get(ip)[field_index];16804 const field_name = struct_type.field_names.get(ip)[field_index];
16614 const field_name_len = field_name.length(ip);16805 const field_name_len = field_name.length(ip);
16615 const field_ty: Type = .fromInterned(struct_type.field_types.get(ip)[field_index]);
16616 const field_default: InternPool.Index = if (struct_type.field_defaults.len > 0) d: {16806 const field_default: InternPool.Index = if (struct_type.field_defaults.len > 0) d: {
16617 break :d struct_type.field_defaults.get(ip)[field_index];16807 break :d struct_type.field_defaults.get(ip)[field_index];
16618 } else .none;16808 } else .none;
...@@ -16660,30 +16850,63 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16660,30 +16850,63 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16660 } }));16850 } }));
16661 };16851 };
1666216852
16663 const struct_field_fields = .{16853 const struct_field_attr_fields = .{
16664 // name: [:0]const u8,16854 // @"comptime": bool,
16665 name_val,
16666 // type: type,
16667 field_ty.toIntern(),
16668 // default_value: ?*const anyopaque,
16669 default_val_ptr.toIntern(),
16670 // is_comptime: bool,
16671 Value.makeBool(field_is_comptime).toIntern(),16855 Value.makeBool(field_is_comptime).toIntern(),
16672 // alignment: ?usize,16856 // @"align": ?usize,
16673 alignment_val.toIntern(),16857 alignment_val.toIntern(),
16858 // default_value_ptr: ?*const anyopaque,
16859 default_val_ptr.toIntern(),
16674 };16860 };
16675 field_val.* = (try pt.aggregateValue(struct_field_ty, &struct_field_fields)).toIntern();16861 field_name_val.* = name_val;
16862 field_attr_val.* = (try pt.aggregateValue(struct_field_attr_ty, &struct_field_attr_fields)).toIntern();
16676 }16863 }
16677 }16864 }
1667816865
16679 const fields_val = v: {16866 const field_names_val = v: {
16867 const array_fields_ty = try pt.arrayType(.{
16868 .len = struct_field_name_vals.len,
16869 .child = .slice_const_u8_sentinel_0_type,
16870 });
16871 const new_decl_val = (try pt.aggregateValue(array_fields_ty, struct_field_name_vals)).toIntern();
16872 const slice_ty = (try pt.ptrType(.{
16873 .child = .slice_const_u8_sentinel_0_type,
16874 .flags = .{
16875 .size = .slice,
16876 .is_const = true,
16877 },
16878 })).toIntern();
16879 const manyptr_ty = Type.fromInterned(slice_ty).slicePtrFieldType(zcu).toIntern();
16880 break :v try pt.intern(.{ .slice = .{
16881 .ty = slice_ty,
16882 .ptr = try pt.intern(.{ .ptr = .{
16883 .ty = manyptr_ty,
16884 .base_addr = .{ .uav = .{
16885 .orig_ty = manyptr_ty,
16886 .val = new_decl_val,
16887 } },
16888 .byte_offset = 0,
16889 } }),
16890 .len = (try pt.intValue(.usize, struct_field_name_vals.len)).toIntern(),
16891 } });
16892 };
16893
16894 const field_types_val = v: {
16895 const struct_field_type_vals = switch (ip.indexToKey(ty.toIntern())) {
16896 .tuple_type => |tt| tt.types.get(ip),
16897 .struct_type => blk: {
16898 const st = ip.loadStructType(ty.toIntern());
16899 break :blk st.field_types.get(ip);
16900 },
16901 else => unreachable,
16902 };
16680 const array_fields_ty = try pt.arrayType(.{16903 const array_fields_ty = try pt.arrayType(.{
16681 .len = struct_field_vals.len,16904 .len = struct_field_type_vals.len,
16682 .child = struct_field_ty.toIntern(),16905 .child = .type_type,
16683 });16906 });
16684 const new_decl_val = (try pt.aggregateValue(array_fields_ty, struct_field_vals)).toIntern();16907 const new_decl_val = (try pt.aggregateValue(array_fields_ty, struct_field_type_vals)).toIntern();
16685 const slice_ty = (try pt.ptrType(.{16908 const slice_ty = (try pt.ptrType(.{
16686 .child = struct_field_ty.toIntern(),16909 .child = .type_type,
16687 .flags = .{16910 .flags = .{
16688 .size = .slice,16911 .size = .slice,
16689 .is_const = true,16912 .is_const = true,
...@@ -16700,11 +16923,38 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16700,11 +16923,38 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16700 } },16923 } },
16701 .byte_offset = 0,16924 .byte_offset = 0,
16702 } }),16925 } }),
16703 .len = (try pt.intValue(.usize, struct_field_vals.len)).toIntern(),16926 .len = (try pt.intValue(.usize, struct_field_type_vals.len)).toIntern(),
16927 } });
16928 };
16929 const field_attrs_val = v: {
16930 const array_fields_ty = try pt.arrayType(.{
16931 .len = struct_field_attr_vals.len,
16932 .child = struct_field_attr_ty.toIntern(),
16933 });
16934 const new_decl_val = (try pt.aggregateValue(array_fields_ty, struct_field_attr_vals)).toIntern();
16935 const slice_ty = (try pt.ptrType(.{
16936 .child = struct_field_attr_ty.toIntern(),
16937 .flags = .{
16938 .size = .slice,
16939 .is_const = true,
16940 },
16941 })).toIntern();
16942 const manyptr_ty = Type.fromInterned(slice_ty).slicePtrFieldType(zcu).toIntern();
16943 break :v try pt.intern(.{ .slice = .{
16944 .ty = slice_ty,
16945 .ptr = try pt.intern(.{ .ptr = .{
16946 .ty = manyptr_ty,
16947 .base_addr = .{ .uav = .{
16948 .orig_ty = manyptr_ty,
16949 .val = new_decl_val,
16950 } },
16951 .byte_offset = 0,
16952 } }),
16953 .len = (try pt.intValue(.usize, struct_field_attr_vals.len)).toIntern(),
16704 } });16954 } });
16705 };16955 };
1670616956
16707 const decls_val = try sema.typeInfoDecls(src, ty.getNamespace(zcu));16957 const decl_names_val = try sema.typeInfoDecls(ty.getNamespace(zcu));
1670816958
16709 const backing_integer_val = try pt.intern(.{ .opt = .{16959 const backing_integer_val = try pt.intern(.{ .opt = .{
16710 .ty = (try pt.optionalType(.type_type)).toIntern(),16960 .ty = (try pt.optionalType(.type_type)).toIntern(),
...@@ -16719,16 +16969,22 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16719,16 +16969,22 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16719 const layout = ty.containerLayout(zcu);16969 const layout = ty.containerLayout(zcu);
1672016970
16721 const field_values = [_]InternPool.Index{16971 const field_values = [_]InternPool.Index{
16972 // is_tuple: bool,
16973 Value.makeBool(ty.isTuple(zcu)).toIntern(),
16722 // layout: ContainerLayout,16974 // layout: ContainerLayout,
16723 (try pt.enumValueFieldIndex(container_layout_ty, @intFromEnum(layout))).toIntern(),16975 (try pt.enumValueFieldIndex(container_layout_ty, @intFromEnum(layout))).toIntern(),
16724 // backing_integer: ?type,16976 // backing_integer: ?type,
16725 backing_integer_val,16977 backing_integer_val,
16726 // fields: []const StructField,16978
16727 fields_val,16979 // field_names: []const [:0]const u8,
16728 // decls: []const Declaration,16980 field_names_val,
16729 decls_val,16981 // field_types: []const type,
16730 // is_tuple: bool,16982 field_types_val,
16731 Value.makeBool(ty.isTuple(zcu)).toIntern(),16983 // field_attrs: []const FieldAttributes,
16984 field_attrs_val,
16985
16986 // decl_names: []const [:0]const u8,
16987 decl_names_val,
16732 };16988 };
16733 return Air.internedToRef((try pt.internUnion(.{16989 return Air.internedToRef((try pt.internUnion(.{
16734 .ty = type_info_ty.toIntern(),16990 .ty = type_info_ty.toIntern(),
...@@ -16739,11 +16995,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16739,11 +16995,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
16739 .@"opaque" => {16995 .@"opaque" => {
16740 const type_opaque_ty = try sema.getStdLangType(src, .@"Type.Opaque");16996 const type_opaque_ty = try sema.getStdLangType(src, .@"Type.Opaque");
1674116997
16742 const decls_val = try sema.typeInfoDecls(src, ty.getNamespace(zcu));16998 const decl_names_val = try sema.typeInfoDecls(ty.getNamespace(zcu));
1674316999
16744 const field_values = .{17000 const field_values = .{
16745 // decls: []const Declaration,17001 // decl_names: []const [:0]const u8,
16746 decls_val,17002 decl_names_val,
16747 };17003 };
16748 return Air.internedToRef((try pt.internUnion(.{17004 return Air.internedToRef((try pt.internUnion(.{
16749 .ty = type_info_ty.toIntern(),17005 .ty = type_info_ty.toIntern(),
...@@ -16758,30 +17014,27 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -16758,30 +17014,27 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1675817014
16759fn typeInfoDecls(17015fn typeInfoDecls(
16760 sema: *Sema,17016 sema: *Sema,
16761 src: LazySrcLoc,
16762 opt_namespace: InternPool.OptionalNamespaceIndex,17017 opt_namespace: InternPool.OptionalNamespaceIndex,
16763) CompileError!InternPool.Index {17018) CompileError!InternPool.Index {
16764 const pt = sema.pt;17019 const pt = sema.pt;
16765 const zcu = pt.zcu;17020 const zcu = pt.zcu;
16766 const gpa = sema.gpa;17021 const gpa = sema.gpa;
1676717022
16768 const declaration_ty = try sema.getStdLangType(src, .@"Type.Declaration");
16769
16770 var decl_vals = std.array_list.Managed(InternPool.Index).init(gpa);17023 var decl_vals = std.array_list.Managed(InternPool.Index).init(gpa);
16771 defer decl_vals.deinit();17024 defer decl_vals.deinit();
1677217025
16773 var seen_namespaces = std.AutoHashMap(*Namespace, void).init(gpa);17026 var seen_namespaces = std.AutoHashMap(*Namespace, void).init(gpa);
16774 defer seen_namespaces.deinit();17027 defer seen_namespaces.deinit();
1677517028
16776 try sema.typeInfoNamespaceDecls(opt_namespace, declaration_ty, &decl_vals, &seen_namespaces);17029 try sema.typeInfoNamespaceDecls(opt_namespace, &decl_vals, &seen_namespaces);
1677717030
16778 const array_decl_ty = try pt.arrayType(.{17031 const array_decl_ty = try pt.arrayType(.{
16779 .len = decl_vals.items.len,17032 .len = decl_vals.items.len,
16780 .child = declaration_ty.toIntern(),17033 .child = .slice_const_u8_sentinel_0_type,
16781 });17034 });
16782 const new_decl_val = (try pt.aggregateValue(array_decl_ty, decl_vals.items)).toIntern();17035 const new_decl_val = (try pt.aggregateValue(array_decl_ty, decl_vals.items)).toIntern();
16783 const slice_ty = (try pt.ptrType(.{17036 const slice_ty = (try pt.ptrType(.{
16784 .child = declaration_ty.toIntern(),17037 .child = .slice_const_u8_sentinel_0_type,
16785 .flags = .{17038 .flags = .{
16786 .size = .slice,17039 .size = .slice,
16787 .is_const = true,17040 .is_const = true,
...@@ -16805,7 +17058,6 @@ fn typeInfoDecls(...@@ -16805,7 +17058,6 @@ fn typeInfoDecls(
16805fn typeInfoNamespaceDecls(17058fn typeInfoNamespaceDecls(
16806 sema: *Sema,17059 sema: *Sema,
16807 opt_namespace_index: InternPool.OptionalNamespaceIndex,17060 opt_namespace_index: InternPool.OptionalNamespaceIndex,
16808 declaration_ty: Type,
16809 decl_vals: *std.array_list.Managed(InternPool.Index),17061 decl_vals: *std.array_list.Managed(InternPool.Index),
16810 seen_namespaces: *std.AutoHashMap(*Namespace, void),17062 seen_namespaces: *std.AutoHashMap(*Namespace, void),
16811) !void {17063) !void {
...@@ -16850,11 +17102,7 @@ fn typeInfoNamespaceDecls(...@@ -16850,11 +17102,7 @@ fn typeInfoNamespaceDecls(
16850 },17102 },
16851 });17103 });
16852 };17104 };
16853 const fields = [_]InternPool.Index{17105 try decl_vals.append(name_val);
16854 // name: [:0]const u8,
16855 name_val,
16856 };
16857 try decl_vals.append((try pt.aggregateValue(declaration_ty, &fields)).toIntern());
16858 }17106 }
16859}17107}
1686017108
...@@ -19470,11 +19718,11 @@ fn zirReifySliceArgTy(...@@ -19470,11 +19718,11 @@ fn zirReifySliceArgTy(
1947019718
19471 const comptime_reason: std.zig.SimpleComptimeReason, const in_scalar_ty: Type, const out_scalar_ty: Type = switch (info) {19719 const comptime_reason: std.zig.SimpleComptimeReason, const in_scalar_ty: Type, const out_scalar_ty: Type = switch (info) {
19472 // zig fmt: off19720 // zig fmt: off
19473 .type_to_fn_param_attrs => .{ .fn_param_attrs, .type, try sema.getStdLangType(src, .@"Type.Fn.Param.Attributes") },19721 .type_to_fn_param_attrs => .{ .fn_param_attrs, .type, try sema.getStdLangType(src, .@"Type.Fn.ParamAttributes") },
19474 .string_to_struct_field_type => .{ .struct_field_types, .slice_const_u8, .type },19722 .string_to_struct_field_type => .{ .struct_field_types, .slice_const_u8, .type },
19475 .string_to_union_field_type => .{ .union_field_types, .slice_const_u8, .type },19723 .string_to_union_field_type => .{ .union_field_types, .slice_const_u8, .type },
19476 .string_to_struct_field_attrs => .{ .struct_field_attrs, .slice_const_u8, try sema.getStdLangType(src, .@"Type.StructField.Attributes") },19724 .string_to_struct_field_attrs => .{ .struct_field_attrs, .slice_const_u8, try sema.getStdLangType(src, .@"Type.Struct.FieldAttributes") },
19477 .string_to_union_field_attrs => .{ .union_field_attrs, .slice_const_u8, try sema.getStdLangType(src, .@"Type.UnionField.Attributes") },19725 .string_to_union_field_attrs => .{ .union_field_attrs, .slice_const_u8, try sema.getStdLangType(src, .@"Type.Union.FieldAttributes") },
19478 // zig fmt: on19726 // zig fmt: on
19479 };19727 };
1948019728
...@@ -19688,7 +19936,7 @@ fn zirReifyFn(...@@ -19688,7 +19936,7 @@ fn zirReifyFn(
19688 const ret_ty_src = block.builtinCallArgSrc(extra.node, 2);19936 const ret_ty_src = block.builtinCallArgSrc(extra.node, 2);
19689 const fn_attrs_src = block.builtinCallArgSrc(extra.node, 3);19937 const fn_attrs_src = block.builtinCallArgSrc(extra.node, 3);
1969019938
19691 const single_param_attrs_ty = try sema.getStdLangType(param_attrs_src, .@"Type.Fn.Param.Attributes");19939 const single_param_attrs_ty = try sema.getStdLangType(param_attrs_src, .@"Type.Fn.ParamAttributes");
19692 const fn_attrs_ty = try sema.getStdLangType(fn_attrs_src, .@"Type.Fn.Attributes");19940 const fn_attrs_ty = try sema.getStdLangType(fn_attrs_src, .@"Type.Fn.Attributes");
1969319941
19694 const param_types_uncoerced = sema.resolveInst(extra.param_types);19942 const param_types_uncoerced = sema.resolveInst(extra.param_types);
...@@ -19827,7 +20075,7 @@ fn zirReifyStruct(...@@ -19827,7 +20075,7 @@ fn zirReifyStruct(
19827 };20075 };
1982820076
19829 const container_layout_ty = try sema.getStdLangType(layout_src, .@"Type.ContainerLayout");20077 const container_layout_ty = try sema.getStdLangType(layout_src, .@"Type.ContainerLayout");
19830 const single_field_attrs_ty = try sema.getStdLangType(field_attrs_src, .@"Type.StructField.Attributes");20078 const single_field_attrs_ty = try sema.getStdLangType(field_attrs_src, .@"Type.Struct.FieldAttributes");
1983120079
19832 const layout_uncoerced = sema.resolveInst(extra.layout);20080 const layout_uncoerced = sema.resolveInst(extra.layout);
19833 const layout_coerced = try sema.coerce(block, container_layout_ty, layout_uncoerced, layout_src);20081 const layout_coerced = try sema.coerce(block, container_layout_ty, layout_uncoerced, layout_src);
...@@ -20107,7 +20355,7 @@ fn zirReifyUnion(...@@ -20107,7 +20355,7 @@ fn zirReifyUnion(
20107 };20355 };
2010820356
20109 const container_layout_ty = try sema.getStdLangType(layout_src, .@"Type.ContainerLayout");20357 const container_layout_ty = try sema.getStdLangType(layout_src, .@"Type.ContainerLayout");
20110 const single_field_attrs_ty = try sema.getStdLangType(field_attrs_src, .@"Type.UnionField.Attributes");20358 const single_field_attrs_ty = try sema.getStdLangType(field_attrs_src, .@"Type.Union.FieldAttributes");
2011120359
20112 const layout_uncoerced = sema.resolveInst(extra.layout);20360 const layout_uncoerced = sema.resolveInst(extra.layout);
20113 const layout_coerced = try sema.coerce(block, container_layout_ty, layout_uncoerced, layout_src);20361 const layout_coerced = try sema.coerce(block, container_layout_ty, layout_uncoerced, layout_src);
src/Zcu.zig+9-19
...@@ -448,8 +448,7 @@ pub const StdLangDecl = enum {...@@ -448,8 +448,7 @@ pub const StdLangDecl = enum {
448448
449 Type,449 Type,
450 @"Type.Fn",450 @"Type.Fn",
451 @"Type.Fn.Param",451 @"Type.Fn.ParamAttributes",
452 @"Type.Fn.Param.Attributes",
453 @"Type.Fn.Attributes",452 @"Type.Fn.Attributes",
454 @"Type.Int",453 @"Type.Int",
455 @"Type.Float",454 @"Type.Float",
...@@ -459,20 +458,16 @@ pub const StdLangDecl = enum {...@@ -459,20 +458,16 @@ pub const StdLangDecl = enum {
459 @"Type.Array",458 @"Type.Array",
460 @"Type.Vector",459 @"Type.Vector",
461 @"Type.Optional",460 @"Type.Optional",
462 @"Type.Error",
463 @"Type.ErrorUnion",461 @"Type.ErrorUnion",
464 @"Type.EnumField",462 @"Type.ErrorSet",
465 @"Type.Enum",463 @"Type.Enum",
466 @"Type.Enum.Mode",464 @"Type.Enum.Mode",
467 @"Type.Union",465 @"Type.Union",
468 @"Type.UnionField",466 @"Type.Union.FieldAttributes",
469 @"Type.UnionField.Attributes",
470 @"Type.Struct",467 @"Type.Struct",
471 @"Type.StructField",468 @"Type.Struct.FieldAttributes",
472 @"Type.StructField.Attributes",
473 @"Type.ContainerLayout",469 @"Type.ContainerLayout",
474 @"Type.Opaque",470 @"Type.Opaque",
475 @"Type.Declaration",
476471
477 panic,472 panic,
478 @"panic.call",473 @"panic.call",
...@@ -533,8 +528,7 @@ pub const StdLangDecl = enum {...@@ -533,8 +528,7 @@ pub const StdLangDecl = enum {
533528
534 .Type,529 .Type,
535 .@"Type.Fn",530 .@"Type.Fn",
536 .@"Type.Fn.Param",531 .@"Type.Fn.ParamAttributes",
537 .@"Type.Fn.Param.Attributes",
538 .@"Type.Fn.Attributes",532 .@"Type.Fn.Attributes",
539 .@"Type.Int",533 .@"Type.Int",
540 .@"Type.Float",534 .@"Type.Float",
...@@ -544,20 +538,16 @@ pub const StdLangDecl = enum {...@@ -544,20 +538,16 @@ pub const StdLangDecl = enum {
544 .@"Type.Array",538 .@"Type.Array",
545 .@"Type.Vector",539 .@"Type.Vector",
546 .@"Type.Optional",540 .@"Type.Optional",
547 .@"Type.Error",
548 .@"Type.ErrorUnion",541 .@"Type.ErrorUnion",
549 .@"Type.EnumField",542 .@"Type.ErrorSet",
550 .@"Type.Enum",543 .@"Type.Enum",
551 .@"Type.Enum.Mode",544 .@"Type.Enum.Mode",
552 .@"Type.Union",545 .@"Type.Union",
553 .@"Type.UnionField",546 .@"Type.Union.FieldAttributes",
554 .@"Type.UnionField.Attributes",
555 .@"Type.Struct",547 .@"Type.Struct",
556 .@"Type.StructField",548 .@"Type.Struct.FieldAttributes",
557 .@"Type.StructField.Attributes",
558 .@"Type.ContainerLayout",549 .@"Type.ContainerLayout",
559 .@"Type.Opaque",550 .@"Type.Opaque",
560 .@"Type.Declaration",
561 => .type,551 => .type,
562552
563 .panic => .type,553 .panic => .type,
...@@ -611,7 +601,7 @@ pub const StdLangDecl = enum {...@@ -611,7 +601,7 @@ pub const StdLangDecl = enum {
611 .VaList => .va_list,601 .VaList => .va_list,
612 .assembly, .@"assembly.Clobbers" => .assembly,602 .assembly, .@"assembly.Clobbers" => .assembly,
613 else => {603 else => {
614 if (@intFromEnum(decl) <= @intFromEnum(StdLangDecl.@"Type.Declaration")) {604 if (@intFromEnum(decl) <= @intFromEnum(StdLangDecl.@"Type.Opaque")) {
615 return .main;605 return .main;
616 } else {606 } else {
617 return .panic;607 return .panic;