summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJérôme Vouillon <jerome.vouillon@gmail.com>2024-03-27 17:26:57 -0400
committerGitHub <noreply@github.com>2024-03-27 14:26:57 -0700
commiteae2638a53e778e24e1ed042f2e16aa0b3b127a5 (patch)
treee5e3bf1c41c86050cba7953f6097799bf6100ec1 /test
parent61877e9bbc6df38d3bb342a695ead0bc290fbb40 (diff)
downloadbinaryen-eae2638a53e778e24e1ed042f2e16aa0b3b127a5.tar.gz
binaryen-eae2638a53e778e24e1ed042f2e16aa0b3b127a5.tar.bz2
binaryen-eae2638a53e778e24e1ed042f2e16aa0b3b127a5.zip
wasm-merge: Check that the types of imports and exports match (#6437)
Diffstat (limited to 'test')
-rw-r--r--test/lit/merge/types.wat84
1 files changed, 84 insertions, 0 deletions
diff --git a/test/lit/merge/types.wat b/test/lit/merge/types.wat
new file mode 100644
index 000000000..604679dc4
--- /dev/null
+++ b/test/lit/merge/types.wat
@@ -0,0 +1,84 @@
+;; RUN: not wasm-merge %s env -all 2>&1 | filecheck %s
+
+;; Test of exports / imports type matching
+
+;; CHECK: Type mismatch when importing function f1 from module env ($bad1): type (type $func.0 (func)) is not a subtype of (type $func.0 (func (param (ref eq)))).
+;; CHECK-NEXT: Type mismatch when importing function f3 from module env ($bad2): type (type $func.0 (sub (func (result anyref)))) is not a subtype of (type $func.0 (sub $func.1 (func (result eqref)))).
+;; CHECK-NEXT: Type mismatch when importing table t1 from module env ($bad1): minimal size 10 is smaller than expected minimal size 11.
+;; CHECK-NEXT: Type mismatch when importing table t1 from module env ($bad2): maximal size 100 is larger than expected maximal size 99.
+;; CHECK-NEXT: Type mismatch when importing table t2 from module env ($bad3): expecting a bounded table but the imported table is unbounded.
+;; CHECK-NEXT: Type mismatch when importing table t3 from module env ($bad4): export type anyref is different from import type funcref.
+;; CHECK-NEXT: Type mismatch when importing memory m1 from module env ($bad1): minimal size 10 is smaller than expected minimal size 11.
+;; CHECK-NEXT: Type mismatch when importing memory m1 from module env ($bad2): maximal size 100 is larger than expected maximal size 99.
+;; CHECK-NEXT: Type mismatch when importing memory m2 from module env ($bad3): expecting a bounded memory but the imported memory is unbounded.
+;; CHECK-NEXT: Type mismatch when importing memory m3 from module env ($bad4): index type should match.
+;; CHECK-NEXT: Type mismatch when importing global g1 from module env ($bad1): mutability should match.
+;; CHECK-NEXT: Type mismatch when importing global g2 from module env ($bad2): mutability should match.
+;; CHECK-NEXT: Type mismatch when importing global g2 from module env ($bad3): export type eqref is different from import type i31ref.
+;; CHECK-NEXT: Type mismatch when importing global g2 from module env ($bad4): export type eqref is different from import type anyref.
+;; CHECK-NEXT: Type mismatch when importing global g1 from module env ($bad5): type eqref is not a subtype of i31ref.
+;; CHECK-NEXT: Type mismatch when importing tag t from module env ($bad1): export type (func (param eqref)) is different from import type (func (param anyref)).
+;; CHECK-NEXT: Type mismatch when importing tag t from module env ($bad2): export type (func (param eqref)) is different from import type (func (param i31ref)).
+;; CHECK-NEXT: Fatal: import/export mismatches
+
+(module
+ (type $f (sub (func (result anyref))))
+ (type $g (sub $f (func (result eqref))))
+
+ (func (export "f1"))
+ (func (export "f2") (type $g) (ref.null eq))
+ (func (export "f3") (type $f) (ref.null eq))
+
+ (import "env" "f1" (func $good1))
+ (import "env" "f2" (func $good2 (type $f)))
+
+ (import "env" "f1" (func $bad1 (param (ref eq))))
+ (import "env" "f3" (func $bad2 (type $g)))
+
+ (table (export "t1") 10 100 funcref)
+ (table (export "t2") 10 funcref)
+ (table (export "t3") 10 anyref)
+
+ (import "env" "t1" (table $good1 10 funcref))
+ (import "env" "t1" (table $good2 10 100 funcref))
+ (import "env" "t2" (table $good3 10 funcref))
+ (import "env" "t3" (table $good4 10 anyref))
+
+ (import "env" "t1" (table $bad1 11 funcref))
+ (import "env" "t1" (table $bad2 10 99 funcref))
+ (import "env" "t2" (table $bad3 10 100 funcref))
+ (import "env" "t3" (table $bad4 10 funcref))
+
+ (memory (export "m1") 10 100)
+ (memory (export "m2") 10)
+ (memory (export "m3") i64 10)
+
+ (import "env" "m1" (memory $good1 10))
+ (import "env" "m1" (memory $good2 10 100))
+ (import "env" "m2" (memory $good3 10))
+ (import "env" "m3" (memory $good4 i64 10))
+
+ (import "env" "m1" (memory $bad1 11))
+ (import "env" "m1" (memory $bad2 10 99))
+ (import "env" "m2" (memory $bad3 10 100))
+ (import "env" "m3" (memory $bad4 10))
+
+ (global (export "g1") eqref (ref.null eq))
+ (global (export "g2") (mut eqref) (ref.null eq))
+
+ (import "env" "g1" (global $good1 anyref))
+ (import "env" "g2" (global $good2 (mut eqref)))
+
+ (import "env" "g1" (global $bad1 (mut eqref)))
+ (import "env" "g2" (global $bad2 eqref))
+ (import "env" "g2" (global $bad3 (mut i31ref)))
+ (import "env" "g2" (global $bad4 (mut anyref)))
+ (import "env" "g1" (global $bad5 i31ref))
+
+ (tag (export "t") (param eqref))
+
+ (import "env" "t" (tag $good1 (param eqref)))
+
+ (import "env" "t" (tag $bad1 (param anyref)))
+ (import "env" "t" (tag $bad2 (param i31ref)))
+)