summaryrefslogtreecommitdiff
path: root/test/lit
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit')
-rw-r--r--test/lit/passes/type-refining.wast55
1 files changed, 55 insertions, 0 deletions
diff --git a/test/lit/passes/type-refining.wast b/test/lit/passes/type-refining.wast
index 8258a3a54..824ad43a8 100644
--- a/test/lit/passes/type-refining.wast
+++ b/test/lit/passes/type-refining.wast
@@ -1167,3 +1167,58 @@
)
)
)
+
+(module
+ (rec
+ ;; CHECK: (rec
+ ;; CHECK-NEXT: (type $A (struct (field (mut nullref))))
+ (type $A (struct (field (mut anyref))))
+ ;; CHECK: (type $B (struct (field (mut nullref))))
+ (type $B (struct (field (mut (ref null $A)))))
+ )
+
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (func $0 (type $none_=>_none)
+ ;; CHECK-NEXT: (block ;; (replaces something unreachable we can't emit)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block ;; (replaces something unreachable we can't emit)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (struct.get $B 0
+ ;; CHECK-NEXT: (struct.new_default $B)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (ref.null none)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0
+ (struct.set $A 0
+ (struct.new $A
+ ;; These two struct.gets will both be refined. That of $B will be
+ ;; refined to a get of a null, at which point the get of $A could get
+ ;; confused and not know what type it is reading from (since in the IR,
+ ;; we depend on the ref for that). The pass should not error here while
+ ;; it refines both the struct type's fields to nullref, after which the
+ ;; code here will be unreachable (since we do a struct.get from a
+ ;; nullref).
+ (struct.get $A 0
+ (struct.get $B 0
+ (struct.new_default $B)
+ )
+ )
+ )
+ (ref.null none)
+ )
+ )
+)