summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/subtypes.wast44
-rw-r--r--test/subtypes.wast.from-wast32
-rw-r--r--test/subtypes.wast.fromBinary33
-rw-r--r--test/subtypes.wast.fromBinary.noDebugInfo33
4 files changed, 142 insertions, 0 deletions
diff --git a/test/subtypes.wast b/test/subtypes.wast
new file mode 100644
index 000000000..d37735777
--- /dev/null
+++ b/test/subtypes.wast
@@ -0,0 +1,44 @@
+;; Test that we can roundtrip struct and array types
+(module
+ ;; Arrays
+ (type $vector-i32 (array i32))
+
+ (type $vector-i31 (array (ref i31)))
+ (type $vector-any (array (ref any)))
+
+ ;; Structs
+ (type $struct-i31 (struct
+ (field (ref i31))
+ ))
+ (type $struct-any (struct
+ (field (ref any))
+ ))
+ (type $struct-i31_any (struct
+ (field (ref i31))
+ (field (ref any))
+ ))
+
+ (func $foo (param $no-null (ref $vector-i32))
+ (param $yes-null (ref null $vector-i32))
+ ;; ok to set a non-nullable reference to a nullable target
+ (local.set $no-null (local.get $yes-null))
+ )
+
+ (func $bar (param $v-i31 (ref $vector-i31))
+ (param $v-any (ref $vector-any))
+ ;; ok to set a vector of (immutable) i31s to a vector of anyies
+ (local.set $v-any (local.get $v-i31))
+ )
+
+ (func $baz (param $s-i31 (ref $struct-i31))
+ (param $s-any (ref $struct-any))
+ ;; ok to set a struct of an (immutable) i31 to a one of an any
+ (local.set $s-any (local.get $s-i31))
+ )
+
+ (func $boo (param $s-i31 (ref $struct-i31))
+ (param $s-i31_any (ref $struct-i31_any))
+ ;; also ok to have extra fields
+ (local.set $s-i31 (local.get $s-i31_any))
+ )
+)
diff --git a/test/subtypes.wast.from-wast b/test/subtypes.wast.from-wast
new file mode 100644
index 000000000..249421578
--- /dev/null
+++ b/test/subtypes.wast.from-wast
@@ -0,0 +1,32 @@
+(module
+ (type ${ref?|i31|} (struct (field (ref null i31))))
+ (type $[i32] (array i32))
+ (type $ref?|{ref?|i31|}|_ref?|{anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${anyref}))))
+ (type $ref?|{ref?|i31|}|_ref?|{ref?|i31|_anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${ref?|i31|_anyref}))))
+ (type $ref?|[i32]|_ref?|[i32]|_=>_none (func (param (ref null $[i32]) (ref null $[i32]))))
+ (type $ref?|[ref?|i31|]|_ref?|[anyref]|_=>_none (func (param (ref null $[ref?|i31|]) (ref null $[anyref]))))
+ (type ${anyref} (struct (field anyref)))
+ (type ${ref?|i31|_anyref} (struct (field (ref null i31)) (field anyref)))
+ (type $[anyref] (array anyref))
+ (type $[ref?|i31|] (array (ref null i31)))
+ (func $foo (param $no-null (ref null $[i32])) (param $yes-null (ref null $[i32]))
+ (local.set $no-null
+ (local.get $yes-null)
+ )
+ )
+ (func $bar (param $v-i31 (ref null $[ref?|i31|])) (param $v-any (ref null $[anyref]))
+ (local.set $v-any
+ (local.get $v-i31)
+ )
+ )
+ (func $baz (param $s-i31 (ref null ${ref?|i31|})) (param $s-any (ref null ${anyref}))
+ (local.set $s-any
+ (local.get $s-i31)
+ )
+ )
+ (func $boo (param $s-i31 (ref null ${ref?|i31|})) (param $s-i31_any (ref null ${ref?|i31|_anyref}))
+ (local.set $s-i31
+ (local.get $s-i31_any)
+ )
+ )
+)
diff --git a/test/subtypes.wast.fromBinary b/test/subtypes.wast.fromBinary
new file mode 100644
index 000000000..44f441f42
--- /dev/null
+++ b/test/subtypes.wast.fromBinary
@@ -0,0 +1,33 @@
+(module
+ (type ${ref?|i31|} (struct (field (ref null i31))))
+ (type $[i32] (array i32))
+ (type $ref?|{ref?|i31|}|_ref?|{anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${anyref}))))
+ (type $ref?|{ref?|i31|}|_ref?|{ref?|i31|_anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${ref?|i31|_anyref}))))
+ (type $ref?|[i32]|_ref?|[i32]|_=>_none (func (param (ref null $[i32]) (ref null $[i32]))))
+ (type $ref?|[ref?|i31|]|_ref?|[anyref]|_=>_none (func (param (ref null $[ref?|i31|]) (ref null $[anyref]))))
+ (type ${anyref} (struct (field anyref)))
+ (type ${ref?|i31|_anyref} (struct (field (ref null i31)) (field anyref)))
+ (type $[anyref] (array anyref))
+ (type $[ref?|i31|] (array (ref null i31)))
+ (func $foo (param $no-null (ref null $[i32])) (param $yes-null (ref null $[i32]))
+ (local.set $no-null
+ (local.get $yes-null)
+ )
+ )
+ (func $bar (param $v-i31 (ref null $[ref?|i31|])) (param $v-any (ref null $[anyref]))
+ (local.set $v-any
+ (local.get $v-i31)
+ )
+ )
+ (func $baz (param $s-i31 (ref null ${ref?|i31|})) (param $s-any (ref null ${anyref}))
+ (local.set $s-any
+ (local.get $s-i31)
+ )
+ )
+ (func $boo (param $s-i31 (ref null ${ref?|i31|})) (param $s-i31_any (ref null ${ref?|i31|_anyref}))
+ (local.set $s-i31
+ (local.get $s-i31_any)
+ )
+ )
+)
+
diff --git a/test/subtypes.wast.fromBinary.noDebugInfo b/test/subtypes.wast.fromBinary.noDebugInfo
new file mode 100644
index 000000000..d80e5afd0
--- /dev/null
+++ b/test/subtypes.wast.fromBinary.noDebugInfo
@@ -0,0 +1,33 @@
+(module
+ (type ${ref?|i31|} (struct (field (ref null i31))))
+ (type $[i32] (array i32))
+ (type $ref?|{ref?|i31|}|_ref?|{anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${anyref}))))
+ (type $ref?|{ref?|i31|}|_ref?|{ref?|i31|_anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${ref?|i31|_anyref}))))
+ (type $ref?|[i32]|_ref?|[i32]|_=>_none (func (param (ref null $[i32]) (ref null $[i32]))))
+ (type $ref?|[ref?|i31|]|_ref?|[anyref]|_=>_none (func (param (ref null $[ref?|i31|]) (ref null $[anyref]))))
+ (type ${anyref} (struct (field anyref)))
+ (type ${ref?|i31|_anyref} (struct (field (ref null i31)) (field anyref)))
+ (type $[anyref] (array anyref))
+ (type $[ref?|i31|] (array (ref null i31)))
+ (func $0 (param $0 (ref null $[i32])) (param $1 (ref null $[i32]))
+ (local.set $0
+ (local.get $1)
+ )
+ )
+ (func $1 (param $0 (ref null $[ref?|i31|])) (param $1 (ref null $[anyref]))
+ (local.set $1
+ (local.get $0)
+ )
+ )
+ (func $2 (param $0 (ref null ${ref?|i31|})) (param $1 (ref null ${anyref}))
+ (local.set $1
+ (local.get $0)
+ )
+ )
+ (func $3 (param $0 (ref null ${ref?|i31|})) (param $1 (ref null ${ref?|i31|_anyref}))
+ (local.set $0
+ (local.get $1)
+ )
+ )
+)
+