summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2023-11-06 12:29:19 -0800
committerGitHub <noreply@github.com>2023-11-06 12:29:19 -0800
commite3d27166370da202bef6c012014604beac41d43f (patch)
treef9e0515c0c6044e6c9b12f6d5d83f8ba99ab0fc3 /test
parent4fba26a77ea344b8d2b49cc8e1afdc8fcda13e96 (diff)
downloadbinaryen-e3d27166370da202bef6c012014604beac41d43f.tar.gz
binaryen-e3d27166370da202bef6c012014604beac41d43f.tar.bz2
binaryen-e3d27166370da202bef6c012014604beac41d43f.zip
Implement table.copy (#6078)
Helps #5951
Diffstat (limited to 'test')
-rw-r--r--test/binaryen.js/exception-handling.js.txt8
-rw-r--r--test/binaryen.js/kitchen-sink.js.txt68
-rw-r--r--test/lit/passes/unsubtyping.wast36
-rw-r--r--test/lit/table-operations.wast36
-rw-r--r--test/spec/table_copy.wast2216
5 files changed, 2324 insertions, 40 deletions
diff --git a/test/binaryen.js/exception-handling.js.txt b/test/binaryen.js/exception-handling.js.txt
index b1f6dab55..062f05202 100644
--- a/test/binaryen.js/exception-handling.js.txt
+++ b/test/binaryen.js/exception-handling.js.txt
@@ -34,7 +34,7 @@
)
)
-getExpressionInfo(throw) = {"id":51,"type":1,"tag":"e"}
-getExpressionInfo(rethrow) = {"id":52,"type":1,"target":"l0"}
-getExpressionInfo(try_catch) = {"id":50,"type":1,"name":"l0","hasCatchAll":0,"delegateTarget":"","isDelegate":0}
-getExpressionInfo(try_delegate) = {"id":50,"type":0,"name":"try_outer","hasCatchAll":1,"delegateTarget":"","isDelegate":0}
+getExpressionInfo(throw) = {"id":52,"type":1,"tag":"e"}
+getExpressionInfo(rethrow) = {"id":53,"type":1,"target":"l0"}
+getExpressionInfo(try_catch) = {"id":51,"type":1,"name":"l0","hasCatchAll":0,"delegateTarget":"","isDelegate":0}
+getExpressionInfo(try_delegate) = {"id":51,"type":0,"name":"try_outer","hasCatchAll":1,"delegateTarget":"","isDelegate":0}
diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt
index 313d51efa..de465a5d3 100644
--- a/test/binaryen.js/kitchen-sink.js.txt
+++ b/test/binaryen.js/kitchen-sink.js.txt
@@ -82,40 +82,40 @@ TableGetId: 45
TableSetId: 46
TableSizeId: 47
TableGrowId: 48
-TryId: 50
-ThrowId: 51
-RethrowId: 52
-TupleMakeId: 53
-TupleExtractId: 54
-RefI31Id: 55
-I31GetId: 56
-CallRefId: 57
-RefTestId: 58
-RefCastId: 59
-BrOnId: 60
-StructNewId: 61
-StructGetId: 62
-StructSetId: 63
-ArrayNewId: 64
-ArrayNewFixedId: 67
-ArrayGetId: 68
-ArraySetId: 69
-ArrayLenId: 70
-ArrayCopy: 71
-RefAs: 75
-StringNew: 76
-StringConst: 77
-StringMeasure: 78
-StringEncode: 79
-StringConcat: 80
-StringEq: 81
-StringAs: 82
-StringWTF8Advance: 83
-StringWTF16Get: 84
-StringIterNext: 85
-StringIterMove: 86
-StringSliceWTF: 87
-StringSliceIter: 88
+TryId: 51
+ThrowId: 52
+RethrowId: 53
+TupleMakeId: 54
+TupleExtractId: 55
+RefI31Id: 56
+I31GetId: 57
+CallRefId: 58
+RefTestId: 59
+RefCastId: 60
+BrOnId: 61
+StructNewId: 62
+StructGetId: 63
+StructSetId: 64
+ArrayNewId: 65
+ArrayNewFixedId: 68
+ArrayGetId: 69
+ArraySetId: 70
+ArrayLenId: 71
+ArrayCopy: 72
+RefAs: 76
+StringNew: 77
+StringConst: 78
+StringMeasure: 79
+StringEncode: 80
+StringConcat: 81
+StringEq: 82
+StringAs: 83
+StringWTF8Advance: 84
+StringWTF16Get: 85
+StringIterNext: 86
+StringIterMove: 87
+StringSliceWTF: 88
+StringSliceIter: 89
getExpressionInfo={"id":15,"type":4,"op":6}
(f32.neg
(f32.const -33.61199951171875)
diff --git a/test/lit/passes/unsubtyping.wast b/test/lit/passes/unsubtyping.wast
index a82d601cc..836aec036 100644
--- a/test/lit/passes/unsubtyping.wast
+++ b/test/lit/passes/unsubtyping.wast
@@ -761,14 +761,14 @@
;; CHECK: (table $t 0 (ref null $super))
(table $t (ref null $super) 1 1)
- ;; CHECK: (func $table-set (type $2)
+ ;; CHECK: (func $table-fill (type $2)
;; CHECK-NEXT: (table.fill $t
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (struct.new_default $sub)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
- (func $table-set
+ (func $table-fill
;; This requires $sub <: $super.
(table.fill $t
(i32.const 0)
@@ -780,6 +780,38 @@
(module
;; CHECK: (rec
+ ;; CHECK-NEXT: (type $0 (func))
+
+ ;; CHECK: (type $super (sub (struct )))
+ (type $super (sub (struct)))
+ ;; CHECK: (type $sub (sub $super (struct )))
+ (type $sub (sub $super (struct)))
+
+ ;; CHECK: (table $super 0 (ref null $super))
+ (table $super (ref null $super) 1 1)
+
+ ;; CHECK: (table $sub 0 (ref null $sub))
+ (table $sub (ref null $sub) 1 1)
+
+ ;; CHECK: (func $table-copy (type $0)
+ ;; CHECK-NEXT: (table.copy $super $sub
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $table-copy
+ ;; This requires $sub <: $super.
+ (table.copy $super $sub
+ (i32.const 0)
+ (i32.const 0)
+ (i32.const 0)
+ )
+ )
+)
+
+(module
+ ;; CHECK: (rec
;; CHECK-NEXT: (type $super (sub (struct )))
(type $super (sub (struct)))
;; CHECK: (type $sub (sub $super (struct )))
diff --git a/test/lit/table-operations.wast b/test/lit/table-operations.wast
index e3daa463b..f3aafe51a 100644
--- a/test/lit/table-operations.wast
+++ b/test/lit/table-operations.wast
@@ -18,6 +18,8 @@
;; CHECK-BINARY: (type $3 (func (param i32 funcref i32)))
+ ;; CHECK-BINARY: (type $4 (func (param i32 i32 i32)))
+
;; CHECK-BINARY: (table $table-1 1 1 funcref)
;; CHECK-TEXT: (type $0 (func))
@@ -27,6 +29,8 @@
;; CHECK-TEXT: (type $3 (func (param i32 funcref i32)))
+ ;; CHECK-TEXT: (type $4 (func (param i32 i32 i32)))
+
;; CHECK-TEXT: (table $table-1 1 1 funcref)
(table $table-1 funcref
(elem $foo)
@@ -173,6 +177,28 @@
(local.get $size)
)
)
+
+ ;; CHECK-BINARY: (func $table-copy (type $4) (param $dest i32) (param $source i32) (param $size i32)
+ ;; CHECK-BINARY-NEXT: (table.copy $table-1 $table-2
+ ;; CHECK-BINARY-NEXT: (local.get $dest)
+ ;; CHECK-BINARY-NEXT: (local.get $source)
+ ;; CHECK-BINARY-NEXT: (local.get $size)
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-BINARY-NEXT: )
+ ;; CHECK-TEXT: (func $table-copy (type $4) (param $dest i32) (param $source i32) (param $size i32)
+ ;; CHECK-TEXT-NEXT: (table.copy $table-1 $table-2
+ ;; CHECK-TEXT-NEXT: (local.get $dest)
+ ;; CHECK-TEXT-NEXT: (local.get $source)
+ ;; CHECK-TEXT-NEXT: (local.get $size)
+ ;; CHECK-TEXT-NEXT: )
+ ;; CHECK-TEXT-NEXT: )
+ (func $table-copy (param $dest i32) (param $source i32) (param $size i32)
+ (table.copy $table-1 $table-2
+ (local.get $dest)
+ (local.get $source)
+ (local.get $size)
+ )
+ )
)
;; CHECK-NODEBUG: (type $0 (func))
@@ -182,6 +208,8 @@
;; CHECK-NODEBUG: (type $3 (func (param i32 funcref i32)))
+;; CHECK-NODEBUG: (type $4 (func (param i32 i32 i32)))
+
;; CHECK-NODEBUG: (table $0 1 1 funcref)
;; CHECK-NODEBUG: (table $1 3 3 funcref)
@@ -237,3 +265,11 @@
;; CHECK-NODEBUG-NEXT: (local.get $2)
;; CHECK-NODEBUG-NEXT: )
;; CHECK-NODEBUG-NEXT: )
+
+;; CHECK-NODEBUG: (func $6 (type $4) (param $0 i32) (param $1 i32) (param $2 i32)
+;; CHECK-NODEBUG-NEXT: (table.copy $0 $1
+;; CHECK-NODEBUG-NEXT: (local.get $0)
+;; CHECK-NODEBUG-NEXT: (local.get $1)
+;; CHECK-NODEBUG-NEXT: (local.get $2)
+;; CHECK-NODEBUG-NEXT: )
+;; CHECK-NODEBUG-NEXT: )
diff --git a/test/spec/table_copy.wast b/test/spec/table_copy.wast
new file mode 100644
index 000000000..a23dbcba5
--- /dev/null
+++ b/test/spec/table_copy.wast
@@ -0,0 +1,2216 @@
+(module
+ (func (export "ef0") (result i32) (i32.const 0))
+ (func (export "ef1") (result i32) (i32.const 1))
+ (func (export "ef2") (result i32) (i32.const 2))
+ (func (export "ef3") (result i32) (i32.const 3))
+ (func (export "ef4") (result i32) (i32.const 4))
+)
+(register "a")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (nop))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 13) (i32.const 2) (i32.const 3)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 25) (i32.const 15) (i32.const 2)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 25)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 26)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 13) (i32.const 25) (i32.const 3)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_trap (invoke "check_t0" (i32.const 13)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 14)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 15)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 20) (i32.const 22) (i32.const 4)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 25) (i32.const 1) (i32.const 3)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 26)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 27)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 10) (i32.const 12) (i32.const 7)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 10)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 11)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 15)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 12) (i32.const 10) (i32.const 7)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 12)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 13)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 17)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 18)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t1) (i32.const 3) func 1 3 1 4)
+ (elem (table $t1) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 10) (i32.const 0) (i32.const 20)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 4))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 1))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 22)) (i32.const 7))
+(assert_return (invoke "check_t1" (i32.const 23)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 24)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 25)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 26)) (i32.const 6))
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (nop))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 13) (i32.const 2) (i32.const 3)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 25) (i32.const 15) (i32.const 2)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 25)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 26)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 13) (i32.const 25) (i32.const 3)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_trap (invoke "check_t0" (i32.const 13)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 14)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 15)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 20) (i32.const 22) (i32.const 4)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 25) (i32.const 1) (i32.const 3)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 26)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 27)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 10) (i32.const 12) (i32.const 7)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 10)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 11)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 15)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t1 $t1 (i32.const 12) (i32.const 10) (i32.const 7)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 12)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 13)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 17)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 18)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 11)) (i32.const 6))
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 7))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (type (func (result i32))) ;; type #0
+ (import "a" "ef0" (func (result i32))) ;; index 0
+ (import "a" "ef1" (func (result i32)))
+ (import "a" "ef2" (func (result i32)))
+ (import "a" "ef3" (func (result i32)))
+ (import "a" "ef4" (func (result i32))) ;; index 4
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t1) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t1) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (elem (table $t0) (i32.const 3) func 1 3 1 4)
+ (elem (table $t0) (i32.const 11) func 6 3 2 5 7)
+ (func (result i32) (i32.const 5)) ;; index 5
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9)) ;; index 9
+ (func (export "test")
+ (table.copy $t0 $t1 (i32.const 10) (i32.const 0) (i32.const 20)))
+ (func (export "check_t0") (param i32) (result i32)
+ (call_indirect $t1 (type 0) (local.get 0)))
+ (func (export "check_t1") (param i32) (result i32)
+ (call_indirect $t0 (type 0) (local.get 0)))
+)
+
+(invoke "test")
+(assert_trap (invoke "check_t0" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 1)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 2)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t0" (i32.const 4)) (i32.const 4))
+(assert_return (invoke "check_t0" (i32.const 5)) (i32.const 1))
+(assert_trap (invoke "check_t0" (i32.const 6)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t0" (i32.const 12)) (i32.const 7))
+(assert_return (invoke "check_t0" (i32.const 13)) (i32.const 5))
+(assert_return (invoke "check_t0" (i32.const 14)) (i32.const 2))
+(assert_return (invoke "check_t0" (i32.const 15)) (i32.const 3))
+(assert_return (invoke "check_t0" (i32.const 16)) (i32.const 6))
+(assert_trap (invoke "check_t0" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 21)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 22)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 23)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 24)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 25)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 26)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t0" (i32.const 29)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 0)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 1)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 2)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 3)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 4)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 5)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 6)) (i32.const 4))
+(assert_trap (invoke "check_t1" (i32.const 7)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 8)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 9)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 10)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 11)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 12)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 13)) (i32.const 1))
+(assert_return (invoke "check_t1" (i32.const 14)) (i32.const 4))
+(assert_return (invoke "check_t1" (i32.const 15)) (i32.const 1))
+(assert_trap (invoke "check_t1" (i32.const 16)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 17)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 18)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 19)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 20)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 21)) "uninitialized element")
+(assert_return (invoke "check_t1" (i32.const 22)) (i32.const 7))
+(assert_return (invoke "check_t1" (i32.const 23)) (i32.const 5))
+(assert_return (invoke "check_t1" (i32.const 24)) (i32.const 2))
+(assert_return (invoke "check_t1" (i32.const 25)) (i32.const 3))
+(assert_return (invoke "check_t1" (i32.const 26)) (i32.const 6))
+(assert_trap (invoke "check_t1" (i32.const 27)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 28)) "uninitialized element")
+(assert_trap (invoke "check_t1" (i32.const 29)) "uninitialized element")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 28) (i32.const 1) (i32.const 3))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 0xFFFFFFFE) (i32.const 1) (i32.const 2))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 15) (i32.const 25) (i32.const 6))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 15) (i32.const 0xFFFFFFFE) (i32.const 2))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 15) (i32.const 25) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 30) (i32.const 15) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 31) (i32.const 15) (i32.const 0))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 15) (i32.const 30) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 15) (i32.const 31) (i32.const 0))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 30) (i32.const 30) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t0 $t0 (i32.const 31) (i32.const 31) (i32.const 0))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 28) (i32.const 1) (i32.const 3))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 0xFFFFFFFE) (i32.const 1) (i32.const 2))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 15) (i32.const 25) (i32.const 6))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 15) (i32.const 0xFFFFFFFE) (i32.const 2))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 15) (i32.const 25) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 30) (i32.const 15) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 31) (i32.const 15) (i32.const 0))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 15) (i32.const 30) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 15) (i32.const 31) (i32.const 0))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 30) (i32.const 30) (i32.const 0))
+ ))
+
+(invoke "test")
+
+(module
+ (table $t0 30 30 funcref)
+ (table $t1 30 30 funcref)
+ (elem (table $t0) (i32.const 2) func 3 1 4 1)
+ (elem funcref
+ (ref.func 2) (ref.func 7) (ref.func 1) (ref.func 8))
+ (elem (table $t0) (i32.const 12) func 7 5 2 3 6)
+ (elem funcref
+ (ref.func 5) (ref.func 9) (ref.func 2) (ref.func 7) (ref.func 6))
+ (func (result i32) (i32.const 0))
+ (func (result i32) (i32.const 1))
+ (func (result i32) (i32.const 2))
+ (func (result i32) (i32.const 3))
+ (func (result i32) (i32.const 4))
+ (func (result i32) (i32.const 5))
+ (func (result i32) (i32.const 6))
+ (func (result i32) (i32.const 7))
+ (func (result i32) (i32.const 8))
+ (func (result i32) (i32.const 9))
+ (func (export "test")
+ (table.copy $t1 $t0 (i32.const 31) (i32.const 31) (i32.const 0))
+ ))
+
+(assert_trap (invoke "test") "out of bounds table access")
+
+;; TODO: add remaining parts that do not pass yet