| ... | @@ -383,7 +383,7 @@ const Analyze = struct { | ... | @@ -383,7 +383,7 @@ const Analyze = struct { |
| 383 | }, | 383 | }, |
| 384 | .ptrtoint => return self.analyzeInstPtrToInt(func, old_inst.cast(text.Inst.PtrToInt).?), | 384 | .ptrtoint => return self.analyzeInstPtrToInt(func, old_inst.cast(text.Inst.PtrToInt).?), |
| 385 | .fieldptr => return self.analyzeInstFieldPtr(func, old_inst.cast(text.Inst.FieldPtr).?), | 385 | .fieldptr => return self.analyzeInstFieldPtr(func, old_inst.cast(text.Inst.FieldPtr).?), |
| 386 | .deref => return self.fail(old_inst.src, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), | 386 | .deref => return self.analyzeInstDeref(func, old_inst.cast(text.Inst.Deref).?), |
| 387 | .as => return self.analyzeInstAs(func, old_inst.cast(text.Inst.As).?), | 387 | .as => return self.analyzeInstAs(func, old_inst.cast(text.Inst.As).?), |
| 388 | .@"asm" => return self.fail(old_inst.src, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), | 388 | .@"asm" => return self.fail(old_inst.src, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| 389 | .@"unreachable" => return self.fail(old_inst.src, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), | 389 | .@"unreachable" => return self.fail(old_inst.src, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), |
| ... | @@ -476,7 +476,7 @@ const Analyze = struct { | ... | @@ -476,7 +476,7 @@ const Analyze = struct { |
| 476 | | 476 | |
| 477 | const elem_ty = switch (object_ptr.ty.zigTypeTag()) { | 477 | const elem_ty = switch (object_ptr.ty.zigTypeTag()) { |
| 478 | .Pointer => object_ptr.ty.elemType(), | 478 | .Pointer => object_ptr.ty.elemType(), |
| 479 | else => return self.fail(fieldptr.base.src, "expected pointer, found '{}'", .{object_ptr.ty}), | 479 | else => return self.fail(fieldptr.positionals.object_ptr.src, "expected pointer, found '{}'", .{object_ptr.ty}), |
| 480 | }; | 480 | }; |
| 481 | switch (elem_ty.zigTypeTag()) { | 481 | switch (elem_ty.zigTypeTag()) { |
| 482 | .Array => { | 482 | .Array => { |
| ... | @@ -535,6 +535,22 @@ const Analyze = struct { | ... | @@ -535,6 +535,22 @@ const Analyze = struct { |
| 535 | return self.fail(intcast.base.src, "TODO implement analyze widen or shorten int", .{}); | 535 | return self.fail(intcast.base.src, "TODO implement analyze widen or shorten int", .{}); |
| 536 | } | 536 | } |
| 537 | | 537 | |
| | 538 | fn analyzeInstDeref(self: *Analyze, func: ?*Fn, deref: *text.Inst.Deref) InnerError!*Inst { |
| | 539 | const ptr = try self.resolveInst(func, deref.positionals.ptr); |
| | 540 | const elem_ty = switch (ptr.ty.zigTypeTag()) { |
| | 541 | .Pointer => ptr.ty.elemType(), |
| | 542 | else => return self.fail(deref.positionals.ptr.src, "expected pointer, found '{}'", .{ptr.ty}), |
| | 543 | }; |
| | 544 | if (ptr.value()) |val| { |
| | 545 | return self.constInst(deref.base.src, .{ |
| | 546 | .ty = elem_ty, |
| | 547 | .val = val.pointerDeref(), |
| | 548 | }); |
| | 549 | } |
| | 550 | |
| | 551 | return self.fail(deref.base.src, "TODO implement runtime deref", .{}); |
| | 552 | } |
| | 553 | |
| 538 | fn coerce(self: *Analyze, dest_type: Type, inst: *Inst) !*Inst { | 554 | fn coerce(self: *Analyze, dest_type: Type, inst: *Inst) !*Inst { |
| 539 | const in_memory_result = coerceInMemoryAllowed(dest_type, inst.ty); | 555 | const in_memory_result = coerceInMemoryAllowed(dest_type, inst.ty); |
| 540 | if (in_memory_result == .ok) { | 556 | if (in_memory_result == .ok) { |