|
62 | 62 | ;; CHECK: (global $A.desc (ref null $A.desc) (global.get $B.desc))
|
63 | 63 | (global $A.desc (ref null $A.desc) (global.get $B.desc))
|
64 | 64 | )
|
| 65 | + |
| 66 | +(module |
| 67 | + (rec |
| 68 | + ;; CHECK: (rec |
| 69 | + ;; CHECK-NEXT: (type $top (sub (descriptor $top.desc (struct)))) |
| 70 | + (type $top (sub (descriptor $top.desc (struct)))) |
| 71 | + ;; CHECK: (type $mid (sub $top (descriptor $mid.desc (struct)))) |
| 72 | + (type $mid (sub $top (descriptor $mid.desc (struct)))) |
| 73 | + ;; CHECK: (type $bot (sub $mid (descriptor $bot.desc (struct)))) |
| 74 | + (type $bot (sub $mid (descriptor $bot.desc (struct)))) |
| 75 | + ;; CHECK: (type $top.desc (sub (describes $top (struct)))) |
| 76 | + (type $top.desc (sub (describes $top (struct)))) |
| 77 | + ;; CHECK: (type $mid.desc (sub $top.desc (describes $mid (struct)))) |
| 78 | + (type $mid.desc (sub $top.desc (describes $mid (struct)))) |
| 79 | + ;; CHECK: (type $bot.desc (sub $mid.desc (describes $bot (struct)))) |
| 80 | + (type $bot.desc (sub $mid.desc (describes $bot (struct)))) |
| 81 | + ) |
| 82 | + |
| 83 | + ;; top -> top.desc |
| 84 | + ;; ^ |
| 85 | + ;; |(2) mid -> mid.desc |
| 86 | + ;; | ^ (1) |
| 87 | + ;; bot -> bot.desc |
| 88 | + ;; |
| 89 | + ;; bot <: top implies bot.desc <: top.desc, but we already have |
| 90 | + ;; bot.desc <: mid.desc, so that gives us bot.desc <: mid.desc <: top.desc. |
| 91 | + ;; This is only valid if we also have bot <: mid <: top. |
| 92 | + |
| 93 | + ;; CHECK: (global $bot-mid-desc (ref null $mid.desc) (struct.new_default $bot.desc)) |
| 94 | + (global $bot-mid-desc (ref null $mid.desc) (struct.new $bot.desc)) |
| 95 | + ;; CHECK: (global $bot-top (ref null $top) (struct.new_default $bot |
| 96 | + ;; CHECK-NEXT: (ref.null none) |
| 97 | + ;; CHECK-NEXT: )) |
| 98 | + (global $bot-top (ref null $top) (struct.new $bot (ref.null none))) |
| 99 | +) |
| 100 | + |
| 101 | +(module |
| 102 | + (rec |
| 103 | + ;; CHECK: (rec |
| 104 | + ;; CHECK-NEXT: (type $top (sub (descriptor $top.desc (struct)))) |
| 105 | + (type $top (sub (descriptor $top.desc (struct)))) |
| 106 | + ;; CHECK: (type $mid (sub $top (descriptor $mid.desc (struct)))) |
| 107 | + (type $mid (sub $top (descriptor $mid.desc (struct)))) |
| 108 | + ;; CHECK: (type $bot (sub $mid (descriptor $bot.desc (struct)))) |
| 109 | + (type $bot (sub $mid (descriptor $bot.desc (struct)))) |
| 110 | + ;; CHECK: (type $top.desc (sub (describes $top (struct)))) |
| 111 | + (type $top.desc (sub (describes $top (struct)))) |
| 112 | + ;; CHECK: (type $mid.desc (sub $top.desc (describes $mid (struct)))) |
| 113 | + (type $mid.desc (sub $top.desc (describes $mid (struct)))) |
| 114 | + ;; CHECK: (type $bot.desc (sub $mid.desc (describes $bot (struct)))) |
| 115 | + (type $bot.desc (sub $mid.desc (describes $bot (struct)))) |
| 116 | + ) |
| 117 | + |
| 118 | + ;; Same as above, but the order of the initial subtypings is reversed. |
| 119 | + ;; |
| 120 | + ;; top -> top.desc |
| 121 | + ;; ^ |
| 122 | + ;; |(1) mid -> mid.desc |
| 123 | + ;; | ^ (2) |
| 124 | + ;; bot -> bot.desc |
| 125 | + ;; |
| 126 | + ;; bot <: top implies bot.desc <: top.desc. When we add bot.desc <: mid.desc, |
| 127 | + ;; that gives us bot.desc <: mid.desc <: top.desc. This is only valid if we |
| 128 | + ;; also have bot <: mid <: top. |
| 129 | + |
| 130 | + ;; CHECK: (global $bot-top (ref null $top) (struct.new_default $bot |
| 131 | + ;; CHECK-NEXT: (ref.null none) |
| 132 | + ;; CHECK-NEXT: )) |
| 133 | + (global $bot-top (ref null $top) (struct.new $bot (ref.null none))) |
| 134 | + ;; CHECK: (global $bot-mid-desc (ref null $mid.desc) (struct.new_default $bot.desc)) |
| 135 | + (global $bot-mid-desc (ref null $mid.desc) (struct.new $bot.desc)) |
| 136 | +) |
0 commit comments