| ... | @@ -4192,12 +4192,12 @@ fn analyzeCall( | ... | @@ -4192,12 +4192,12 @@ fn analyzeCall( |
| 4192 | .auto, | 4192 | .auto, |
| 4193 | .always_inline, | 4193 | .always_inline, |
| 4194 | .compile_time, | 4194 | .compile_time, |
| | 4195 | .no_async, |
| 4195 | => {}, | 4196 | => {}, |
| 4196 | | 4197 | |
| 4197 | .async_kw, | 4198 | .async_kw, |
| 4198 | .never_tail, | 4199 | .never_tail, |
| 4199 | .never_inline, | 4200 | .never_inline, |
| 4200 | .no_async, | | |
| 4201 | .always_tail, | 4201 | .always_tail, |
| 4202 | => return sema.fail(block, call_src, "TODO implement call with modifier {}", .{ | 4202 | => return sema.fail(block, call_src, "TODO implement call with modifier {}", .{ |
| 4203 | modifier, | 4203 | modifier, |
| ... | @@ -10035,51 +10035,93 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -10035,51 +10035,93 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10035 | var buffer: Value.ToTypeBuffer = undefined; | 10035 | var buffer: Value.ToTypeBuffer = undefined; |
| 10036 | break :t try struct_field_ty_decl.val.toType(&buffer).copy(fields_anon_decl.arena()); | 10036 | break :t try struct_field_ty_decl.val.toType(&buffer).copy(fields_anon_decl.arena()); |
| 10037 | }; | 10037 | }; |
| 10038 | | | |
| 10039 | const struct_ty = try sema.resolveTypeFields(block, src, ty); | 10038 | const struct_ty = try sema.resolveTypeFields(block, src, ty); |
| 10040 | const struct_fields = struct_ty.structFields(); | | |
| 10041 | const struct_field_vals = try fields_anon_decl.arena().alloc(Value, struct_fields.count()); | | |
| 10042 | const layout = struct_ty.containerLayout(); | 10039 | const layout = struct_ty.containerLayout(); |
| 10043 | | 10040 | |
| 10044 | for (struct_field_vals) |*field_val, i| { | 10041 | const struct_field_vals = fv: { |
| 10045 | const field = struct_fields.values()[i]; | 10042 | if (struct_ty.castTag(.tuple)) |payload| { |
| 10046 | const name = struct_fields.keys()[i]; | 10043 | const field_types = payload.data.types; |
| 10047 | const name_val = v: { | 10044 | const struct_field_vals = try fields_anon_decl.arena().alloc(Value, field_types.len); |
| 10048 | var anon_decl = try block.startAnonDecl(src); | 10045 | for (struct_field_vals) |*struct_field_val, i| { |
| 10049 | defer anon_decl.deinit(); | 10046 | const field_ty = field_types[i]; |
| 10050 | const bytes = try anon_decl.arena().dupeZ(u8, name); | 10047 | const name_val = v: { |
| 10051 | const new_decl = try anon_decl.finish( | 10048 | var anon_decl = try block.startAnonDecl(src); |
| 10052 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), | 10049 | defer anon_decl.deinit(); |
| 10053 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), | 10050 | const bytes = try std.fmt.allocPrintZ(anon_decl.arena(), "{d}", .{i}); |
| 10054 | ); | 10051 | const new_decl = try anon_decl.finish( |
| 10055 | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); | 10052 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 10056 | }; | 10053 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| | 10054 | ); |
| | 10055 | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| | 10056 | }; |
| 10057 | | 10057 | |
| 10058 | const struct_field_fields = try fields_anon_decl.arena().create([5]Value); | 10058 | const struct_field_fields = try fields_anon_decl.arena().create([5]Value); |
| 10059 | const opt_default_val = if (field.default_val.tag() == .unreachable_value) | 10059 | const field_val = payload.data.values[i]; |
| 10060 | null | 10060 | const is_comptime = field_val.tag() != .unreachable_value; |
| 10061 | else | 10061 | const opt_default_val = if (is_comptime) field_val else null; |
| 10062 | field.default_val; | 10062 | const default_val_ptr = try sema.optRefValue(block, src, field_ty, opt_default_val); |
| 10063 | const default_val_ptr = try sema.optRefValue(block, src, field.ty, opt_default_val); | 10063 | const alignment = field_ty.abiAlignment(target); |
| 10064 | const alignment = switch (layout) { | 10064 | |
| 10065 | .Auto, .Extern => field.normalAlignment(target), | 10065 | struct_field_fields.* = .{ |
| 10066 | .Packed => field.packedAlignment(), | 10066 | // name: []const u8, |
| 10067 | }; | 10067 | name_val, |
| | 10068 | // field_type: type, |
| | 10069 | try Value.Tag.ty.create(fields_anon_decl.arena(), field_ty), |
| | 10070 | // default_value: ?*const anyopaque, |
| | 10071 | try default_val_ptr.copy(fields_anon_decl.arena()), |
| | 10072 | // is_comptime: bool, |
| | 10073 | Value.makeBool(is_comptime), |
| | 10074 | // alignment: comptime_int, |
| | 10075 | try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment), |
| | 10076 | }; |
| | 10077 | struct_field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), struct_field_fields); |
| | 10078 | } |
| | 10079 | break :fv struct_field_vals; |
| | 10080 | } |
| | 10081 | const struct_fields = struct_ty.structFields(); |
| | 10082 | const struct_field_vals = try fields_anon_decl.arena().alloc(Value, struct_fields.count()); |
| | 10083 | |
| | 10084 | for (struct_field_vals) |*field_val, i| { |
| | 10085 | const field = struct_fields.values()[i]; |
| | 10086 | const name = struct_fields.keys()[i]; |
| | 10087 | const name_val = v: { |
| | 10088 | var anon_decl = try block.startAnonDecl(src); |
| | 10089 | defer anon_decl.deinit(); |
| | 10090 | const bytes = try anon_decl.arena().dupeZ(u8, name); |
| | 10091 | const new_decl = try anon_decl.finish( |
| | 10092 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| | 10093 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| | 10094 | ); |
| | 10095 | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| | 10096 | }; |
| 10068 | | 10097 | |
| 10069 | struct_field_fields.* = .{ | 10098 | const struct_field_fields = try fields_anon_decl.arena().create([5]Value); |
| 10070 | // name: []const u8, | 10099 | const opt_default_val = if (field.default_val.tag() == .unreachable_value) |
| 10071 | name_val, | 10100 | null |
| 10072 | // field_type: type, | 10101 | else |
| 10073 | try Value.Tag.ty.create(fields_anon_decl.arena(), field.ty), | 10102 | field.default_val; |
| 10074 | // default_value: ?*const anyopaque, | 10103 | const default_val_ptr = try sema.optRefValue(block, src, field.ty, opt_default_val); |
| 10075 | try default_val_ptr.copy(fields_anon_decl.arena()), | 10104 | const alignment = switch (layout) { |
| 10076 | // is_comptime: bool, | 10105 | .Auto, .Extern => field.normalAlignment(target), |
| 10077 | Value.makeBool(field.is_comptime), | 10106 | .Packed => field.packedAlignment(), |
| 10078 | // alignment: comptime_int, | 10107 | }; |
| 10079 | try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment), | 10108 | |
| 10080 | }; | 10109 | struct_field_fields.* = .{ |
| 10081 | field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), struct_field_fields); | 10110 | // name: []const u8, |
| 10082 | } | 10111 | name_val, |
| | 10112 | // field_type: type, |
| | 10113 | try Value.Tag.ty.create(fields_anon_decl.arena(), field.ty), |
| | 10114 | // default_value: ?*const anyopaque, |
| | 10115 | try default_val_ptr.copy(fields_anon_decl.arena()), |
| | 10116 | // is_comptime: bool, |
| | 10117 | Value.makeBool(field.is_comptime), |
| | 10118 | // alignment: comptime_int, |
| | 10119 | try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment), |
| | 10120 | }; |
| | 10121 | field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), struct_field_fields); |
| | 10122 | } |
| | 10123 | break :fv struct_field_vals; |
| | 10124 | }; |
| 10083 | | 10125 | |
| 10084 | const fields_val = v: { | 10126 | const fields_val = v: { |
| 10085 | const new_decl = try fields_anon_decl.finish( | 10127 | const new_decl = try fields_anon_decl.finish( |