| ... | ... | @@ -300,7 +300,7 @@ pub const Block = struct { |
| 300 | 300 | .ty = ty, |
| 301 | 301 | .payload = try block.sema.addExtra(Air.StructField{ |
| 302 | 302 | .struct_operand = struct_ptr, |
| 303 | | .field_index = @intCast(u32, field_index), |
| 303 | .field_index = field_index, |
| 304 | 304 | }), |
| 305 | 305 | } }, |
| 306 | 306 | }); |
| ... | ... | @@ -315,6 +315,24 @@ pub const Block = struct { |
| 315 | 315 | }); |
| 316 | 316 | } |
| 317 | 317 | |
| 318 | pub fn addStructFieldVal( |
| 319 | block: *Block, |
| 320 | struct_val: Air.Inst.Ref, |
| 321 | field_index: u32, |
| 322 | field_ty: Type, |
| 323 | ) !Air.Inst.Ref { |
| 324 | return block.addInst(.{ |
| 325 | .tag = .struct_field_val, |
| 326 | .data = .{ .ty_pl = .{ |
| 327 | .ty = try block.sema.addType(field_ty), |
| 328 | .payload = try block.sema.addExtra(Air.StructField{ |
| 329 | .struct_operand = struct_val, |
| 330 | .field_index = field_index, |
| 331 | }), |
| 332 | } }, |
| 333 | }); |
| 334 | } |
| 335 | |
| 318 | 336 | pub fn addInst(block: *Block, inst: Air.Inst) error{OutOfMemory}!Air.Inst.Ref { |
| 319 | 337 | return Air.indexToRef(try block.addInstAsIndex(inst)); |
| 320 | 338 | } |
| ... | ... | @@ -11261,8 +11279,10 @@ fn structFieldVal( |
| 11261 | 11279 | const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_ty); |
| 11262 | 11280 | const struct_obj = struct_ty.castTag(.@"struct").?.data; |
| 11263 | 11281 | |
| 11264 | | const field_index = struct_obj.fields.getIndex(field_name) orelse |
| 11282 | const field_index_big = struct_obj.fields.getIndex(field_name) orelse |
| 11265 | 11283 | return sema.failWithBadFieldAccess(block, struct_obj, field_name_src, field_name); |
| 11284 | const field_index = @intCast(u32, field_index_big); |
| 11285 | |
| 11266 | 11286 | const field = struct_obj.fields.values()[field_index]; |
| 11267 | 11287 | |
| 11268 | 11288 | if (try sema.resolveMaybeUndefVal(block, src, struct_byval)) |struct_val| { |
| ... | ... | @@ -11273,16 +11293,7 @@ fn structFieldVal( |
| 11273 | 11293 | } |
| 11274 | 11294 | |
| 11275 | 11295 | try sema.requireRuntimeBlock(block, src); |
| 11276 | | return block.addInst(.{ |
| 11277 | | .tag = .struct_field_val, |
| 11278 | | .data = .{ .ty_pl = .{ |
| 11279 | | .ty = try sema.addType(field.ty), |
| 11280 | | .payload = try sema.addExtra(Air.StructField{ |
| 11281 | | .struct_operand = struct_byval, |
| 11282 | | .field_index = @intCast(u32, field_index), |
| 11283 | | }), |
| 11284 | | } }, |
| 11285 | | }); |
| 11296 | return block.addStructFieldVal(struct_byval, field_index, field.ty); |
| 11286 | 11297 | } |
| 11287 | 11298 | |
| 11288 | 11299 | fn unionFieldPtr( |
| ... | ... | @@ -11341,8 +11352,9 @@ fn unionFieldVal( |
| 11341 | 11352 | const union_ty = try sema.resolveTypeFields(block, src, unresolved_union_ty); |
| 11342 | 11353 | const union_obj = union_ty.cast(Type.Payload.Union).?.data; |
| 11343 | 11354 | |
| 11344 | | const field_index = union_obj.fields.getIndex(field_name) orelse |
| 11355 | const field_index_big = union_obj.fields.getIndex(field_name) orelse |
| 11345 | 11356 | return sema.failWithBadUnionFieldAccess(block, union_obj, field_name_src, field_name); |
| 11357 | const field_index = @intCast(u32, field_index_big); |
| 11346 | 11358 | |
| 11347 | 11359 | const field = union_obj.fields.values()[field_index]; |
| 11348 | 11360 | |
| ... | ... | @@ -11355,7 +11367,7 @@ fn unionFieldVal( |
| 11355 | 11367 | } |
| 11356 | 11368 | |
| 11357 | 11369 | try sema.requireRuntimeBlock(block, src); |
| 11358 | | return sema.fail(block, src, "TODO implement runtime union field access", .{}); |
| 11370 | return block.addStructFieldVal(union_byval, field_index, field.ty); |
| 11359 | 11371 | } |
| 11360 | 11372 | |
| 11361 | 11373 | fn elemPtr( |