|
685 | 685 | )
|
686 | 686 | )
|
687 | 687 |
|
| 688 | + ;; CHECK: (func $cast-desc-and-ref-nullable (type $14) (param $desc (ref null (exact $chain-descriptor))) |
| 689 | + ;; CHECK-NEXT: (local $middle (ref null (exact $chain-middle))) |
| 690 | + ;; CHECK-NEXT: (local $2 (ref null (exact $chain-descriptor))) |
| 691 | + ;; CHECK-NEXT: (local $3 (ref null (exact $chain-descriptor))) |
| 692 | + ;; CHECK-NEXT: (drop |
| 693 | + ;; CHECK-NEXT: (block (result nullref) |
| 694 | + ;; CHECK-NEXT: (local.set $3 |
| 695 | + ;; CHECK-NEXT: (ref.as_non_null |
| 696 | + ;; CHECK-NEXT: (local.get $desc) |
| 697 | + ;; CHECK-NEXT: ) |
| 698 | + ;; CHECK-NEXT: ) |
| 699 | + ;; CHECK-NEXT: (local.set $2 |
| 700 | + ;; CHECK-NEXT: (local.get $3) |
| 701 | + ;; CHECK-NEXT: ) |
| 702 | + ;; CHECK-NEXT: (ref.null none) |
| 703 | + ;; CHECK-NEXT: ) |
| 704 | + ;; CHECK-NEXT: ) |
| 705 | + ;; CHECK-NEXT: (drop |
| 706 | + ;; CHECK-NEXT: (block |
| 707 | + ;; CHECK-NEXT: (drop |
| 708 | + ;; CHECK-NEXT: (ref.null none) |
| 709 | + ;; CHECK-NEXT: ) |
| 710 | + ;; CHECK-NEXT: (drop |
| 711 | + ;; CHECK-NEXT: (ref.null none) |
| 712 | + ;; CHECK-NEXT: ) |
| 713 | + ;; CHECK-NEXT: (unreachable) |
| 714 | + ;; CHECK-NEXT: ) |
| 715 | + ;; CHECK-NEXT: ) |
| 716 | + ;; CHECK-NEXT: ) |
| 717 | + (func $cast-desc-and-ref-nullable (param $desc (ref null (exact $chain-descriptor))) |
| 718 | + ;; Same, but now the cast allows nulls. It should still trap. |
| 719 | + (local $middle (ref null (exact $chain-middle))) |
| 720 | + (local.set $middle |
| 721 | + (struct.new $chain-middle |
| 722 | + (local.get $desc) |
| 723 | + ) |
| 724 | + ) |
| 725 | + (drop |
| 726 | + (ref.cast_desc (ref null (exact $chain-described)) |
| 727 | + (local.get $middle) |
| 728 | + (local.get $middle) |
| 729 | + ) |
| 730 | + ) |
| 731 | + ) |
| 732 | + |
| 733 | + ;; CHECK: (func $cast-desc-and-ref-tee (type $10) |
| 734 | + ;; CHECK-NEXT: (local $desc (ref null (exact $super.desc))) |
| 735 | + ;; CHECK-NEXT: (drop |
| 736 | + ;; CHECK-NEXT: (block |
| 737 | + ;; CHECK-NEXT: (drop |
| 738 | + ;; CHECK-NEXT: (block (result nullref) |
| 739 | + ;; CHECK-NEXT: (ref.null none) |
| 740 | + ;; CHECK-NEXT: ) |
| 741 | + ;; CHECK-NEXT: ) |
| 742 | + ;; CHECK-NEXT: (drop |
| 743 | + ;; CHECK-NEXT: (ref.null none) |
| 744 | + ;; CHECK-NEXT: ) |
| 745 | + ;; CHECK-NEXT: (unreachable) |
| 746 | + ;; CHECK-NEXT: ) |
| 747 | + ;; CHECK-NEXT: ) |
| 748 | + ;; CHECK-NEXT: ) |
| 749 | + (func $cast-desc-and-ref-tee |
| 750 | + ;; The same allocation flows into both the descriptor and the reference |
| 751 | + ;; again, but now it uses a tee. The allocation does not have a descriptor. |
| 752 | + (local $desc (ref null (exact $super.desc))) |
| 753 | + (drop |
| 754 | + (ref.cast_desc (ref (exact $super)) |
| 755 | + (local.tee $desc |
| 756 | + (struct.new $super.desc) |
| 757 | + ) |
| 758 | + (local.get $desc) |
| 759 | + ) |
| 760 | + ) |
| 761 | + ) |
| 762 | + |
| 763 | + ;; CHECK: (func $cast-desc-and-ref-tee-nullable (type $10) |
| 764 | + ;; CHECK-NEXT: (local $desc (ref null (exact $super.desc))) |
| 765 | + ;; CHECK-NEXT: (drop |
| 766 | + ;; CHECK-NEXT: (block |
| 767 | + ;; CHECK-NEXT: (drop |
| 768 | + ;; CHECK-NEXT: (block (result nullref) |
| 769 | + ;; CHECK-NEXT: (ref.null none) |
| 770 | + ;; CHECK-NEXT: ) |
| 771 | + ;; CHECK-NEXT: ) |
| 772 | + ;; CHECK-NEXT: (drop |
| 773 | + ;; CHECK-NEXT: (ref.null none) |
| 774 | + ;; CHECK-NEXT: ) |
| 775 | + ;; CHECK-NEXT: (unreachable) |
| 776 | + ;; CHECK-NEXT: ) |
| 777 | + ;; CHECK-NEXT: ) |
| 778 | + ;; CHECK-NEXT: ) |
| 779 | + (func $cast-desc-and-ref-tee-nullable |
| 780 | + ;; Same, but the cast allows nulls. It should still trap. |
| 781 | + (local $desc (ref null (exact $super.desc))) |
| 782 | + (drop |
| 783 | + (ref.cast_desc (ref null (exact $super)) |
| 784 | + (local.tee $desc |
| 785 | + (struct.new $super.desc) |
| 786 | + ) |
| 787 | + (local.get $desc) |
| 788 | + ) |
| 789 | + ) |
| 790 | + ) |
| 791 | + |
688 | 792 | ;; CHECK: (func $cast-desc-stale-parent (type $15) (result (ref (exact $super)))
|
689 | 793 | ;; CHECK-NEXT: (drop
|
690 | 794 | ;; CHECK-NEXT: (block (result nullref)
|
|
0 commit comments