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