|
54 | 54 |
|
55 | 55 | ;; CHECK: (func $dropped (type $10) |
56 | 56 | ;; CHECK-NEXT: (local $0 i32) |
57 | | - ;; CHECK-NEXT: (local $1 (ref null (exact $descriptor))) |
| 57 | + ;; CHECK-NEXT: (local $1 (ref (exact $descriptor))) |
58 | 58 | ;; CHECK-NEXT: (local $2 i32) |
59 | | - ;; CHECK-NEXT: (local $3 (ref null (exact $descriptor))) |
| 59 | + ;; CHECK-NEXT: (local $3 (ref (exact $descriptor))) |
60 | 60 | ;; CHECK-NEXT: (drop |
61 | 61 | ;; CHECK-NEXT: (block (result nullref) |
62 | 62 | ;; CHECK-NEXT: (local.set $2 |
|
88 | 88 |
|
89 | 89 | ;; CHECK: (func $dropped-default (type $10) |
90 | 90 | ;; CHECK-NEXT: (local $0 i32) |
91 | | - ;; CHECK-NEXT: (local $1 (ref null (exact $descriptor))) |
92 | | - ;; CHECK-NEXT: (local $2 (ref null (exact $descriptor))) |
| 91 | + ;; CHECK-NEXT: (local $1 (ref (exact $descriptor))) |
| 92 | + ;; CHECK-NEXT: (local $2 (ref (exact $descriptor))) |
93 | 93 | ;; CHECK-NEXT: (drop |
94 | 94 | ;; CHECK-NEXT: (block (result nullref) |
95 | 95 | ;; CHECK-NEXT: (local.set $2 |
|
211 | 211 | ;; CHECK-NEXT: (local $1 (ref (exact $sub.desc))) |
212 | 212 | ;; CHECK-NEXT: (block (result (ref (exact $sub.desc))) |
213 | 213 | ;; CHECK-NEXT: (drop |
214 | | - ;; CHECK-NEXT: (block (result nullref) |
| 214 | + ;; CHECK-NEXT: (block (result (ref null $super)) |
215 | 215 | ;; CHECK-NEXT: (block (result nullref) |
216 | 216 | ;; CHECK-NEXT: (local.set $1 |
217 | 217 | ;; CHECK-NEXT: (struct.new_default $sub.desc) |
|
241 | 241 |
|
242 | 242 | ;; CHECK: (func $cast-desc-success (type $10) |
243 | 243 | ;; CHECK-NEXT: (local $desc (ref null (exact $super.desc))) |
244 | | - ;; CHECK-NEXT: (local $1 (ref null (exact $super.desc))) |
245 | | - ;; CHECK-NEXT: (local $2 (ref null (exact $super.desc))) |
| 244 | + ;; CHECK-NEXT: (local $1 (ref (exact $super.desc))) |
| 245 | + ;; CHECK-NEXT: (local $2 (ref (exact $super.desc))) |
246 | 246 | ;; CHECK-NEXT: (local.set $desc |
247 | 247 | ;; CHECK-NEXT: (struct.new_default $super.desc) |
248 | 248 | ;; CHECK-NEXT: ) |
|
334 | 334 | ) |
335 | 335 |
|
336 | 336 | ;; CHECK: (func $cast-desc-fail-reverse (type $11) (param $desc (ref null (exact $super.desc))) |
337 | | - ;; CHECK-NEXT: (local $1 (ref null (exact $super.desc))) |
338 | | - ;; CHECK-NEXT: (local $2 (ref null (exact $super.desc))) |
| 337 | + ;; CHECK-NEXT: (local $1 (ref (exact $super.desc))) |
| 338 | + ;; CHECK-NEXT: (local $2 (ref (exact $super.desc))) |
339 | 339 | ;; CHECK-NEXT: (drop |
340 | 340 | ;; CHECK-NEXT: (block (result nullref) |
341 | 341 | ;; CHECK-NEXT: (drop |
|
639 | 639 |
|
640 | 640 | ;; CHECK: (func $cast-desc-and-ref (type $14) (param $desc (ref null (exact $chain-descriptor))) |
641 | 641 | ;; CHECK-NEXT: (local $middle (ref null (exact $chain-middle))) |
642 | | - ;; CHECK-NEXT: (local $2 (ref null (exact $chain-descriptor))) |
643 | | - ;; CHECK-NEXT: (local $3 (ref null (exact $chain-descriptor))) |
| 642 | + ;; CHECK-NEXT: (local $2 (ref (exact $chain-descriptor))) |
| 643 | + ;; CHECK-NEXT: (local $3 (ref (exact $chain-descriptor))) |
644 | 644 | ;; CHECK-NEXT: (drop |
645 | 645 | ;; CHECK-NEXT: (block (result nullref) |
646 | 646 | ;; CHECK-NEXT: (local.set $3 |
|
687 | 687 |
|
688 | 688 | ;; CHECK: (func $cast-desc-and-ref-nullable (type $14) (param $desc (ref null (exact $chain-descriptor))) |
689 | 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))) |
| 690 | + ;; CHECK-NEXT: (local $2 (ref (exact $chain-descriptor))) |
| 691 | + ;; CHECK-NEXT: (local $3 (ref (exact $chain-descriptor))) |
692 | 692 | ;; CHECK-NEXT: (drop |
693 | 693 | ;; CHECK-NEXT: (block (result nullref) |
694 | 694 | ;; CHECK-NEXT: (local.set $3 |
|
868 | 868 |
|
869 | 869 | ;; CHECK: (type $2 (func (result (ref (exact $desc))))) |
870 | 870 |
|
871 | | - ;; CHECK: (func $test (type $2) (result (ref (exact $desc))) |
872 | | - ;; CHECK-NEXT: (local $0 nullref) |
873 | | - ;; CHECK-NEXT: (local $1 nullref) |
| 871 | + ;; CHECK: (type $3 (func (param (ref null (exact $desc))) (result (ref (exact $desc))))) |
| 872 | + |
| 873 | + ;; CHECK: (func $null (type $2) (result (ref (exact $desc))) |
| 874 | + ;; CHECK-NEXT: (local $0 (ref none)) |
| 875 | + ;; CHECK-NEXT: (local $1 (ref none)) |
874 | 876 | ;; CHECK-NEXT: (drop |
875 | 877 | ;; CHECK-NEXT: (block (result nullref) |
876 | 878 | ;; CHECK-NEXT: (local.set $1 |
|
884 | 886 | ;; CHECK-NEXT: (ref.null none) |
885 | 887 | ;; CHECK-NEXT: ) |
886 | 888 | ;; CHECK-NEXT: ) |
887 | | - ;; CHECK-NEXT: (unreachable) |
| 889 | + ;; CHECK-NEXT: (local.get $0) |
888 | 890 | ;; CHECK-NEXT: ) |
889 | | - (func $test (result (ref (exact $desc))) |
| 891 | + (func $null (result (ref (exact $desc))) |
890 | 892 | ;; Read a null descriptor from a struct.new we can convert to locals. We do |
891 | 893 | ;; not end up with a (ref (exact $desc)) here, since this will trap, so we |
892 | 894 | ;; emit an unreachable. |
|
896 | 898 | ) |
897 | 899 | ) |
898 | 900 | ) |
| 901 | + |
| 902 | + ;; CHECK: (func $nullable-param (type $3) (param $desc (ref null (exact $desc))) (result (ref (exact $desc))) |
| 903 | + ;; CHECK-NEXT: (local $1 (ref (exact $desc))) |
| 904 | + ;; CHECK-NEXT: (local $2 (ref (exact $desc))) |
| 905 | + ;; CHECK-NEXT: (drop |
| 906 | + ;; CHECK-NEXT: (block (result nullref) |
| 907 | + ;; CHECK-NEXT: (local.set $2 |
| 908 | + ;; CHECK-NEXT: (ref.as_non_null |
| 909 | + ;; CHECK-NEXT: (local.get $desc) |
| 910 | + ;; CHECK-NEXT: ) |
| 911 | + ;; CHECK-NEXT: ) |
| 912 | + ;; CHECK-NEXT: (local.set $1 |
| 913 | + ;; CHECK-NEXT: (local.get $2) |
| 914 | + ;; CHECK-NEXT: ) |
| 915 | + ;; CHECK-NEXT: (ref.null none) |
| 916 | + ;; CHECK-NEXT: ) |
| 917 | + ;; CHECK-NEXT: ) |
| 918 | + ;; CHECK-NEXT: (local.get $1) |
| 919 | + ;; CHECK-NEXT: ) |
| 920 | + (func $nullable-param (param $desc (ref null (exact $desc))) (result (ref (exact $desc))) |
| 921 | + ;; Read a null descriptor from a nullable param. |
| 922 | + (ref.get_desc $struct |
| 923 | + (struct.new_default $struct |
| 924 | + (local.get $desc) |
| 925 | + ) |
| 926 | + ) |
| 927 | + ) |
| 928 | + |
| 929 | + ;; CHECK: (func $nullable-local (type $2) (result (ref (exact $desc))) |
| 930 | + ;; CHECK-NEXT: (local $desc (ref null (exact $desc))) |
| 931 | + ;; CHECK-NEXT: (local $1 (ref (exact $desc))) |
| 932 | + ;; CHECK-NEXT: (local $2 (ref (exact $desc))) |
| 933 | + ;; CHECK-NEXT: (drop |
| 934 | + ;; CHECK-NEXT: (block (result nullref) |
| 935 | + ;; CHECK-NEXT: (local.set $2 |
| 936 | + ;; CHECK-NEXT: (ref.as_non_null |
| 937 | + ;; CHECK-NEXT: (local.get $desc) |
| 938 | + ;; CHECK-NEXT: ) |
| 939 | + ;; CHECK-NEXT: ) |
| 940 | + ;; CHECK-NEXT: (local.set $1 |
| 941 | + ;; CHECK-NEXT: (local.get $2) |
| 942 | + ;; CHECK-NEXT: ) |
| 943 | + ;; CHECK-NEXT: (ref.null none) |
| 944 | + ;; CHECK-NEXT: ) |
| 945 | + ;; CHECK-NEXT: ) |
| 946 | + ;; CHECK-NEXT: (local.get $1) |
| 947 | + ;; CHECK-NEXT: ) |
| 948 | + (func $nullable-local (result (ref (exact $desc))) |
| 949 | + (local $desc (ref null (exact $desc))) |
| 950 | + ;; Read a null descriptor from a nullable local. |
| 951 | + (ref.get_desc $struct |
| 952 | + (struct.new_default $struct |
| 953 | + (local.get $desc) |
| 954 | + ) |
| 955 | + ) |
| 956 | + ) |
899 | 957 | ) |
900 | 958 |
|
901 | 959 | ;; A definitely-failing descriptor cast. We have two pairs of descriptor/ |
|
0 commit comments