diff --git a/extended-const/data/data.0.wasm b/extended-const/data/data.0.wasm new file mode 100644 index 00000000..f5dae0f9 Binary files /dev/null and b/extended-const/data/data.0.wasm differ diff --git a/extended-const/data/data.1.wasm b/extended-const/data/data.1.wasm new file mode 100644 index 00000000..bed5e765 Binary files /dev/null and b/extended-const/data/data.1.wasm differ diff --git a/extended-const/data/data.10.wasm b/extended-const/data/data.10.wasm new file mode 100644 index 00000000..18ed2c82 Binary files /dev/null and b/extended-const/data/data.10.wasm differ diff --git a/extended-const/data/data.11.wasm b/extended-const/data/data.11.wasm new file mode 100644 index 00000000..ce9dd9bb Binary files /dev/null and b/extended-const/data/data.11.wasm differ diff --git a/extended-const/data/data.12.wasm b/extended-const/data/data.12.wasm new file mode 100644 index 00000000..35e1076d Binary files /dev/null and b/extended-const/data/data.12.wasm differ diff --git a/extended-const/data/data.13.wasm b/extended-const/data/data.13.wasm new file mode 100644 index 00000000..a27b4feb Binary files /dev/null and b/extended-const/data/data.13.wasm differ diff --git a/extended-const/data/data.14.wasm b/extended-const/data/data.14.wasm new file mode 100644 index 00000000..16b29787 Binary files /dev/null and b/extended-const/data/data.14.wasm differ diff --git a/extended-const/data/data.15.wasm b/extended-const/data/data.15.wasm new file mode 100644 index 00000000..5b30856e Binary files /dev/null and b/extended-const/data/data.15.wasm differ diff --git a/extended-const/data/data.16.wasm b/extended-const/data/data.16.wasm new file mode 100644 index 00000000..99d1297a Binary files /dev/null and b/extended-const/data/data.16.wasm differ diff --git a/extended-const/data/data.17.wasm b/extended-const/data/data.17.wasm new file mode 100644 index 00000000..2f335cb3 Binary files /dev/null and b/extended-const/data/data.17.wasm differ diff --git a/extended-const/data/data.18.wasm b/extended-const/data/data.18.wasm new file mode 100644 index 00000000..16b29787 Binary files /dev/null and b/extended-const/data/data.18.wasm differ diff --git a/extended-const/data/data.19.wasm b/extended-const/data/data.19.wasm new file mode 100644 index 00000000..5b30856e Binary files /dev/null and b/extended-const/data/data.19.wasm differ diff --git a/extended-const/data/data.2.wasm b/extended-const/data/data.2.wasm new file mode 100644 index 00000000..5bcc160a Binary files /dev/null and b/extended-const/data/data.2.wasm differ diff --git a/extended-const/data/data.20.wasm b/extended-const/data/data.20.wasm new file mode 100644 index 00000000..99d1297a Binary files /dev/null and b/extended-const/data/data.20.wasm differ diff --git a/extended-const/data/data.21.wasm b/extended-const/data/data.21.wasm new file mode 100644 index 00000000..2b9f8d01 Binary files /dev/null and b/extended-const/data/data.21.wasm differ diff --git a/extended-const/data/data.22.wasm b/extended-const/data/data.22.wasm new file mode 100644 index 00000000..4e16452e Binary files /dev/null and b/extended-const/data/data.22.wasm differ diff --git a/extended-const/data/data.23.wasm b/extended-const/data/data.23.wasm new file mode 100644 index 00000000..54addd2c Binary files /dev/null and b/extended-const/data/data.23.wasm differ diff --git a/extended-const/data/data.24.wasm b/extended-const/data/data.24.wasm new file mode 100644 index 00000000..899b501d Binary files /dev/null and b/extended-const/data/data.24.wasm differ diff --git a/extended-const/data/data.25.wasm b/extended-const/data/data.25.wasm new file mode 100644 index 00000000..1b418825 Binary files /dev/null and b/extended-const/data/data.25.wasm differ diff --git a/extended-const/data/data.26.wasm b/extended-const/data/data.26.wasm new file mode 100644 index 00000000..b9b37af7 Binary files /dev/null and b/extended-const/data/data.26.wasm differ diff --git a/extended-const/data/data.27.wasm b/extended-const/data/data.27.wasm new file mode 100644 index 00000000..4f66c917 Binary files /dev/null and b/extended-const/data/data.27.wasm differ diff --git a/extended-const/data/data.28.wasm b/extended-const/data/data.28.wasm new file mode 100644 index 00000000..67afd69e Binary files /dev/null and b/extended-const/data/data.28.wasm differ diff --git a/extended-const/data/data.29.wasm b/extended-const/data/data.29.wasm new file mode 100644 index 00000000..5b277ef2 Binary files /dev/null and b/extended-const/data/data.29.wasm differ diff --git a/extended-const/data/data.3.wasm b/extended-const/data/data.3.wasm new file mode 100644 index 00000000..ff08b7d1 Binary files /dev/null and b/extended-const/data/data.3.wasm differ diff --git a/extended-const/data/data.30.wasm b/extended-const/data/data.30.wasm new file mode 100644 index 00000000..5c8468a0 Binary files /dev/null and b/extended-const/data/data.30.wasm differ diff --git a/extended-const/data/data.31.wasm b/extended-const/data/data.31.wasm new file mode 100644 index 00000000..7ba207e5 Binary files /dev/null and b/extended-const/data/data.31.wasm differ diff --git a/extended-const/data/data.32.wasm b/extended-const/data/data.32.wasm new file mode 100644 index 00000000..cfb111d1 Binary files /dev/null and b/extended-const/data/data.32.wasm differ diff --git a/extended-const/data/data.33.wasm b/extended-const/data/data.33.wasm new file mode 100644 index 00000000..7a81b390 Binary files /dev/null and b/extended-const/data/data.33.wasm differ diff --git a/extended-const/data/data.34.wasm b/extended-const/data/data.34.wasm new file mode 100644 index 00000000..4d69a483 Binary files /dev/null and b/extended-const/data/data.34.wasm differ diff --git a/extended-const/data/data.35.wasm b/extended-const/data/data.35.wasm new file mode 100644 index 00000000..731ed5f1 Binary files /dev/null and b/extended-const/data/data.35.wasm differ diff --git a/extended-const/data/data.36.wasm b/extended-const/data/data.36.wasm new file mode 100644 index 00000000..22ad3fcb Binary files /dev/null and b/extended-const/data/data.36.wasm differ diff --git a/extended-const/data/data.37.wasm b/extended-const/data/data.37.wasm new file mode 100644 index 00000000..d614b912 Binary files /dev/null and b/extended-const/data/data.37.wasm differ diff --git a/extended-const/data/data.38.wasm b/extended-const/data/data.38.wasm new file mode 100644 index 00000000..e3714e49 Binary files /dev/null and b/extended-const/data/data.38.wasm differ diff --git a/extended-const/data/data.39.wasm b/extended-const/data/data.39.wasm new file mode 100644 index 00000000..4c0fa405 Binary files /dev/null and b/extended-const/data/data.39.wasm differ diff --git a/extended-const/data/data.4.wasm b/extended-const/data/data.4.wasm new file mode 100644 index 00000000..574adc1f Binary files /dev/null and b/extended-const/data/data.4.wasm differ diff --git a/extended-const/data/data.40.wasm b/extended-const/data/data.40.wasm new file mode 100644 index 00000000..6717ce25 Binary files /dev/null and b/extended-const/data/data.40.wasm differ diff --git a/extended-const/data/data.41.wasm b/extended-const/data/data.41.wasm new file mode 100644 index 00000000..af905905 Binary files /dev/null and b/extended-const/data/data.41.wasm differ diff --git a/extended-const/data/data.42.wasm b/extended-const/data/data.42.wasm new file mode 100644 index 00000000..3488bfee Binary files /dev/null and b/extended-const/data/data.42.wasm differ diff --git a/extended-const/data/data.43.wasm b/extended-const/data/data.43.wasm new file mode 100644 index 00000000..0ec7bcfb Binary files /dev/null and b/extended-const/data/data.43.wasm differ diff --git a/extended-const/data/data.44.wasm b/extended-const/data/data.44.wasm new file mode 100644 index 00000000..0d15760c Binary files /dev/null and b/extended-const/data/data.44.wasm differ diff --git a/extended-const/data/data.45.wasm b/extended-const/data/data.45.wasm new file mode 100644 index 00000000..e00ce9ca Binary files /dev/null and b/extended-const/data/data.45.wasm differ diff --git a/extended-const/data/data.46.wasm b/extended-const/data/data.46.wasm new file mode 100644 index 00000000..8b7546ce Binary files /dev/null and b/extended-const/data/data.46.wasm differ diff --git a/extended-const/data/data.47.wasm b/extended-const/data/data.47.wasm new file mode 100644 index 00000000..e00ce9ca Binary files /dev/null and b/extended-const/data/data.47.wasm differ diff --git a/extended-const/data/data.48.wasm b/extended-const/data/data.48.wasm new file mode 100644 index 00000000..450fb730 Binary files /dev/null and b/extended-const/data/data.48.wasm differ diff --git a/extended-const/data/data.49.wasm b/extended-const/data/data.49.wasm new file mode 100644 index 00000000..d8371516 Binary files /dev/null and b/extended-const/data/data.49.wasm differ diff --git a/extended-const/data/data.5.wasm b/extended-const/data/data.5.wasm new file mode 100644 index 00000000..d23af521 Binary files /dev/null and b/extended-const/data/data.5.wasm differ diff --git a/extended-const/data/data.50.wasm b/extended-const/data/data.50.wasm new file mode 100644 index 00000000..f69ac8da Binary files /dev/null and b/extended-const/data/data.50.wasm differ diff --git a/extended-const/data/data.51.wasm b/extended-const/data/data.51.wasm new file mode 100644 index 00000000..9feb627c Binary files /dev/null and b/extended-const/data/data.51.wasm differ diff --git a/extended-const/data/data.52.wasm b/extended-const/data/data.52.wasm new file mode 100644 index 00000000..da9cf929 Binary files /dev/null and b/extended-const/data/data.52.wasm differ diff --git a/extended-const/data/data.53.wasm b/extended-const/data/data.53.wasm new file mode 100644 index 00000000..765de6ff Binary files /dev/null and b/extended-const/data/data.53.wasm differ diff --git a/extended-const/data/data.54.wasm b/extended-const/data/data.54.wasm new file mode 100644 index 00000000..9cab2fcd Binary files /dev/null and b/extended-const/data/data.54.wasm differ diff --git a/extended-const/data/data.55.wasm b/extended-const/data/data.55.wasm new file mode 100644 index 00000000..9ff01bf4 Binary files /dev/null and b/extended-const/data/data.55.wasm differ diff --git a/extended-const/data/data.56.wasm b/extended-const/data/data.56.wasm new file mode 100644 index 00000000..9ec7b417 Binary files /dev/null and b/extended-const/data/data.56.wasm differ diff --git a/extended-const/data/data.57.wasm b/extended-const/data/data.57.wasm new file mode 100644 index 00000000..22c6f1ff Binary files /dev/null and b/extended-const/data/data.57.wasm differ diff --git a/extended-const/data/data.58.wasm b/extended-const/data/data.58.wasm new file mode 100644 index 00000000..5ecf5fa2 Binary files /dev/null and b/extended-const/data/data.58.wasm differ diff --git a/extended-const/data/data.59.wasm b/extended-const/data/data.59.wasm new file mode 100644 index 00000000..276373cf Binary files /dev/null and b/extended-const/data/data.59.wasm differ diff --git a/extended-const/data/data.6.wasm b/extended-const/data/data.6.wasm new file mode 100644 index 00000000..8b63c1ad Binary files /dev/null and b/extended-const/data/data.6.wasm differ diff --git a/extended-const/data/data.60.wasm b/extended-const/data/data.60.wasm new file mode 100644 index 00000000..c4ff31f3 Binary files /dev/null and b/extended-const/data/data.60.wasm differ diff --git a/extended-const/data/data.61.wasm b/extended-const/data/data.61.wasm new file mode 100644 index 00000000..6dba53e4 Binary files /dev/null and b/extended-const/data/data.61.wasm differ diff --git a/extended-const/data/data.62.wasm b/extended-const/data/data.62.wasm new file mode 100644 index 00000000..e0a54941 Binary files /dev/null and b/extended-const/data/data.62.wasm differ diff --git a/extended-const/data/data.63.wasm b/extended-const/data/data.63.wasm new file mode 100644 index 00000000..6bdf9ca8 Binary files /dev/null and b/extended-const/data/data.63.wasm differ diff --git a/extended-const/data/data.64.wasm b/extended-const/data/data.64.wasm new file mode 100644 index 00000000..bcf57cae Binary files /dev/null and b/extended-const/data/data.64.wasm differ diff --git a/extended-const/data/data.7.wasm b/extended-const/data/data.7.wasm new file mode 100644 index 00000000..d23af521 Binary files /dev/null and b/extended-const/data/data.7.wasm differ diff --git a/extended-const/data/data.8.wasm b/extended-const/data/data.8.wasm new file mode 100644 index 00000000..8b63c1ad Binary files /dev/null and b/extended-const/data/data.8.wasm differ diff --git a/extended-const/data/data.9.wasm b/extended-const/data/data.9.wasm new file mode 100644 index 00000000..18ed2c82 Binary files /dev/null and b/extended-const/data/data.9.wasm differ diff --git a/extended-const/data/data.json b/extended-const/data/data.json new file mode 100644 index 00000000..dc1d5e3b --- /dev/null +++ b/extended-const/data/data.json @@ -0,0 +1,67 @@ +{"source_filename": "data.wast", + "commands": [ + {"type": "module", "line": 5, "filename": "data.0.wasm"}, + {"type": "module", "line": 35, "filename": "data.1.wasm"}, + {"type": "module", "line": 39, "filename": "data.2.wasm"}, + {"type": "module", "line": 44, "filename": "data.3.wasm"}, + {"type": "module", "line": 52, "filename": "data.4.wasm"}, + {"type": "module", "line": 62, "filename": "data.5.wasm"}, + {"type": "module", "line": 67, "filename": "data.6.wasm"}, + {"type": "module", "line": 73, "filename": "data.7.wasm"}, + {"type": "module", "line": 78, "filename": "data.8.wasm"}, + {"type": "assert_invalid", "line": 85, "filename": "data.9.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 89, "filename": "data.10.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "module", "line": 96, "filename": "data.11.wasm"}, + {"type": "module", "line": 101, "filename": "data.12.wasm"}, + {"type": "module", "line": 107, "filename": "data.13.wasm"}, + {"type": "module", "line": 112, "filename": "data.14.wasm"}, + {"type": "module", "line": 116, "filename": "data.15.wasm"}, + {"type": "module", "line": 121, "filename": "data.16.wasm"}, + {"type": "module", "line": 126, "filename": "data.17.wasm"}, + {"type": "module", "line": 131, "filename": "data.18.wasm"}, + {"type": "module", "line": 135, "filename": "data.19.wasm"}, + {"type": "module", "line": 140, "filename": "data.20.wasm"}, + {"type": "module", "line": 145, "filename": "data.21.wasm"}, + {"type": "module", "line": 150, "filename": "data.22.wasm"}, + {"type": "module", "line": 155, "filename": "data.23.wasm"}, + {"type": "module", "line": 161, "filename": "data.24.wasm"}, + {"type": "module", "line": 167, "filename": "data.25.wasm"}, + {"type": "module", "line": 172, "filename": "data.26.wasm"}, + {"type": "module", "line": 179, "filename": "data.27.wasm"}, + {"type": "module", "line": 184, "filename": "data.28.wasm"}, + {"type": "module", "line": 189, "filename": "data.29.wasm"}, + {"type": "module", "line": 196, "filename": "data.30.wasm"}, + {"type": "assert_uninstantiable", "line": 212, "filename": "data.31.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 220, "filename": "data.32.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 228, "filename": "data.33.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 235, "filename": "data.34.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 242, "filename": "data.35.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 259, "filename": "data.36.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 268, "filename": "data.37.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 275, "filename": "data.38.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 283, "filename": "data.39.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 291, "filename": "data.40.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 299, "filename": "data.41.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 306, "filename": "data.42.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 314, "filename": "data.43.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 321, "filename": "data.44.wasm", "text": "out of bounds memory access", "module_type": "binary"}, + {"type": "assert_invalid", "line": 331, "filename": "data.45.wasm", "text": "unknown memory", "module_type": "binary"}, + {"type": "assert_invalid", "line": 339, "filename": "data.46.wasm", "text": "unknown memory 1", "module_type": "binary"}, + {"type": "assert_invalid", "line": 352, "filename": "data.47.wasm", "text": "unknown memory 0", "module_type": "binary"}, + {"type": "assert_invalid", "line": 363, "filename": "data.48.wasm", "text": "unknown memory 1", "module_type": "binary"}, + {"type": "assert_invalid", "line": 375, "filename": "data.49.wasm", "text": "unknown memory 1", "module_type": "binary"}, + {"type": "assert_invalid", "line": 397, "filename": "data.50.wasm", "text": "unknown memory 1", "module_type": "binary"}, + {"type": "assert_invalid", "line": 416, "filename": "data.51.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 424, "filename": "data.52.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 432, "filename": "data.53.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 440, "filename": "data.54.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 448, "filename": "data.55.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 457, "filename": "data.56.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 466, "filename": "data.57.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 474, "filename": "data.58.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 482, "filename": "data.59.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 490, "filename": "data.60.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 498, "filename": "data.61.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 507, "filename": "data.62.wasm", "text": "unknown global 0", "module_type": "binary"}, + {"type": "assert_invalid", "line": 515, "filename": "data.63.wasm", "text": "unknown global 1", "module_type": "binary"}, + {"type": "assert_invalid", "line": 524, "filename": "data.64.wasm", "text": "constant expression required", "module_type": "binary"}]} diff --git a/extended-const/data/data.wast b/extended-const/data/data.wast new file mode 100644 index 00000000..1a53d81f --- /dev/null +++ b/extended-const/data/data.wast @@ -0,0 +1,530 @@ +;; Test the data section + +;; Syntax + +(module + (memory $m 1) + (data (i32.const 0)) + (data (i32.const 1) "a" "" "bcd") + (data (offset (i32.const 0))) + (data (offset (i32.const 0)) "" "a" "bc" "") + (data (memory 0) (i32.const 0)) + (data (memory 0x0) (i32.const 1) "a" "" "bcd") + (data (memory 0x000) (offset (i32.const 0))) + (data (memory 0) (offset (i32.const 0)) "" "a" "bc" "") + (data (memory $m) (i32.const 0)) + (data (memory $m) (i32.const 1) "a" "" "bcd") + (data (memory $m) (offset (i32.const 0))) + (data (memory $m) (offset (i32.const 0)) "" "a" "bc" "") + (data $d1 (i32.const 0)) + (data $d2 (i32.const 1) "a" "" "bcd") + (data $d3 (offset (i32.const 0))) + (data $d4 (offset (i32.const 0)) "" "a" "bc" "") + (data $d5 (memory 0) (i32.const 0)) + (data $d6 (memory 0x0) (i32.const 1) "a" "" "bcd") + (data $d7 (memory 0x000) (offset (i32.const 0))) + (data $d8 (memory 0) (offset (i32.const 0)) "" "a" "bc" "") + (data $d9 (memory $m) (i32.const 0)) + (data $d10 (memory $m) (i32.const 1) "a" "" "bcd") + (data $d11 (memory $m) (offset (i32.const 0))) + (data $d12 (memory $m) (offset (i32.const 0)) "" "a" "bc" "") +) + +;; Basic use + +(module + (memory 1) + (data (i32.const 0) "a") +) +(module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0) "a") +) + +(module + (memory 1) + (data (i32.const 0) "a") + (data (i32.const 3) "b") + (data (i32.const 100) "cde") + (data (i32.const 5) "x") + (data (i32.const 3) "c") +) +(module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0) "a") + (data (i32.const 1) "b") + (data (i32.const 2) "cde") + (data (i32.const 3) "f") + (data (i32.const 2) "g") + (data (i32.const 1) "h") +) + +(module + (global (import "spectest" "global_i32") i32) + (memory 1) + (data (global.get 0) "a") +) +(module + (global (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 1)) + (data (global.get 0) "a") +) + +(module + (global $g (import "spectest" "global_i32") i32) + (memory 1) + (data (global.get $g) "a") +) +(module + (global $g (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 1)) + (data (global.get $g) "a") +) + +(assert_invalid + (module (memory 1) (global i32 (i32.const 0)) (data (global.get 0) "a")) + "unknown global" +) +(assert_invalid + (module (memory 1) (global $g i32 (i32.const 0)) (data (global.get $g) "a")) + "unknown global" +) + + +;; Corner cases + +(module + (memory 1) + (data (i32.const 0) "a") + (data (i32.const 0xffff) "b") +) +(module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0) "a") + (data (i32.const 0xffff) "b") +) + +(module + (memory 2) + (data (i32.const 0x1_ffff) "a") +) + +(module + (memory 0) + (data (i32.const 0)) +) +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 0)) +) + +(module + (memory 0 0) + (data (i32.const 0)) +) + +(module + (memory 1) + (data (i32.const 0x1_0000) "") +) + +(module + (memory 0) + (data (i32.const 0) "" "") +) +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 0) "" "") +) + +(module + (memory 0 0) + (data (i32.const 0) "" "") +) + +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 0) "a") +) + +(module + (import "spectest" "memory" (memory 0 3)) + (data (i32.const 0) "a") +) + +(module + (global (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 0)) + (data (global.get 0) "a") +) + +(module + (global (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 0 3)) + (data (global.get 0) "a") +) + +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 1) "a") +) + +(module + (import "spectest" "memory" (memory 0 3)) + (data (i32.const 1) "a") +) + +;; Extended contant expressions + +(module + (memory 1) + (data (i32.add (i32.const 0) (i32.const 42))) +) + +(module + (memory 1) + (data (i32.sub (i32.const 42) (i32.const 0))) +) + +(module + (memory 1) + (data (i32.mul (i32.const 1) (i32.const 2))) +) + +;; Combining add, sub, mul and global.get + +(module + (global (import "spectest" "global_i32") i32) + (memory 1) + (data (i32.mul + (i32.const 2) + (i32.add + (i32.sub (global.get 0) (i32.const 1)) + (i32.const 2) + ) + ) + ) +) + +;; Invalid bounds for data + +(assert_trap + (module + (memory 0) + (data (i32.const 0) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 0 0) + (data (i32.const 0) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 0 1) + (data (i32.const 0) "a") + ) + "out of bounds memory access" +) +(assert_trap + (module + (memory 0) + (data (i32.const 1)) + ) + "out of bounds memory access" +) +(assert_trap + (module + (memory 0 1) + (data (i32.const 1)) + ) + "out of bounds memory access" +) + +;; This seems to cause a time-out on Travis. +(;assert_unlinkable + (module + (memory 0x10000) + (data (i32.const 0xffffffff) "ab") + ) + "" ;; either out of memory or out of bounds +;) + +(assert_trap + (module + (global (import "spectest" "global_i32") i32) + (memory 0) + (data (global.get 0) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 1 2) + (data (i32.const 0x1_0000) "a") + ) + "out of bounds memory access" +) +(assert_trap + (module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0x1_0000) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 2) + (data (i32.const 0x2_0000) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 2 3) + (data (i32.const 0x2_0000) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 1) + (data (i32.const -1) "a") + ) + "out of bounds memory access" +) +(assert_trap + (module + (import "spectest" "memory" (memory 1)) + (data (i32.const -1) "a") + ) + "out of bounds memory access" +) + +(assert_trap + (module + (memory 2) + (data (i32.const -100) "a") + ) + "out of bounds memory access" +) +(assert_trap + (module + (import "spectest" "memory" (memory 1)) + (data (i32.const -100) "a") + ) + "out of bounds memory access" +) + +;; Data without memory + +(assert_invalid + (module + (data (i32.const 0) "") + ) + "unknown memory" +) + +;; Data segment with memory index 1 (only memory 0 available) +(assert_invalid + (module binary + "\00asm" "\01\00\00\00" + "\05\03\01" ;; memory section + "\00\00" ;; memory 0 + "\0b\07\01" ;; data section + "\02\01\41\00\0b" ;; active data segment 0 for memory 1 + "\00" ;; empty vec(byte) + ) + "unknown memory 1" +) + +;; Data segment with memory index 0 (no memory section) +(assert_invalid + (module binary + "\00asm" "\01\00\00\00" + "\0b\06\01" ;; data section + "\00\41\00\0b" ;; active data segment 0 for memory 0 + "\00" ;; empty vec(byte) + ) + "unknown memory 0" +) + +;; Data segment with memory index 1 (no memory section) +(assert_invalid + (module binary + "\00asm" "\01\00\00\00" + "\0b\07\01" ;; data section + "\02\01\41\00\0b" ;; active data segment 0 for memory 1 + "\00" ;; empty vec(byte) + ) + "unknown memory 1" +) + +;; Data segment with memory index 1 and vec(byte) as above, +;; only memory 0 available. +(assert_invalid + (module binary + "\00asm" "\01\00\00\00" + "\05\03\01" ;; memory section + "\00\00" ;; memory 0 + "\0b\45\01" ;; data section + "\02" ;; active segment + "\01" ;; memory index + "\41\00\0b" ;; offset constant expression + "\3e" ;; vec(byte) length + "\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f" + "\10\11\12\13\14\15\16\17\18\19\1a\1b\1c\1d\1e\1f" + "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f" + "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d" + ) + "unknown memory 1" +) + +;; Data segment with memory index 1 and specially crafted vec(byte) after. +;; This is to detect incorrect validation where memory index is interpreted +;; as a flag followed by "\41" interpreted as the size of vec(byte) +;; with the expected number of bytes following. +(assert_invalid + (module binary + "\00asm" "\01\00\00\00" + "\0b\45\01" ;; data section + "\02" ;; active segment + "\01" ;; memory index + "\41\00\0b" ;; offset constant expression + "\3e" ;; vec(byte) length + "\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f" + "\10\11\12\13\14\15\16\17\18\19\1a\1b\1c\1d\1e\1f" + "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f" + "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d" + ) + "unknown memory 1" +) + + +;; Invalid offsets + +(assert_invalid + (module + (memory 1) + (data (i64.const 0)) + ) + "type mismatch" +) + +(assert_invalid + (module + (memory 1) + (data (ref.null func)) + ) + "type mismatch" +) + +(assert_invalid + (module + (memory 1) + (data (offset (;empty instruction sequence;))) + ) + "type mismatch" +) + +(assert_invalid + (module + (memory 1) + (data (offset (i32.const 0) (i32.const 0))) + ) + "type mismatch" +) + +(assert_invalid + (module + (global (import "test" "global-i32") i32) + (memory 1) + (data (offset (global.get 0) (global.get 0))) + ) + "type mismatch" +) + +(assert_invalid + (module + (global (import "test" "global-i32") i32) + (memory 1) + (data (offset (global.get 0) (i32.const 0))) + ) + "type mismatch" +) + +(assert_invalid + (module + (memory 1) + (data (i32.ctz (i32.const 0))) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (nop)) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (offset (nop) (i32.const 0))) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (offset (i32.const 0) (nop))) + ) + "constant expression required" +) + +(assert_invalid + (module + (global $g (import "test" "g") (mut i32)) + (memory 1) + (data (global.get $g)) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (global.get 0)) + ) + "unknown global 0" +) + +(assert_invalid + (module + (global (import "test" "global-i32") i32) + (memory 1) + (data (global.get 1)) + ) + "unknown global 1" +) + +(assert_invalid + (module + (global (import "test" "global-mut-i32") (mut i32)) + (memory 1) + (data (global.get 0)) + ) + "constant expression required" +) diff --git a/extended-const/elem/elem.0.wasm b/extended-const/elem/elem.0.wasm new file mode 100644 index 00000000..253ce7b1 Binary files /dev/null and b/extended-const/elem/elem.0.wasm differ diff --git a/extended-const/elem/elem.1.wasm b/extended-const/elem/elem.1.wasm new file mode 100644 index 00000000..f689545b Binary files /dev/null and b/extended-const/elem/elem.1.wasm differ diff --git a/extended-const/elem/elem.10.wasm b/extended-const/elem/elem.10.wasm new file mode 100644 index 00000000..13c75049 Binary files /dev/null and b/extended-const/elem/elem.10.wasm differ diff --git a/extended-const/elem/elem.11.wasm b/extended-const/elem/elem.11.wasm new file mode 100644 index 00000000..13c75049 Binary files /dev/null and b/extended-const/elem/elem.11.wasm differ diff --git a/extended-const/elem/elem.12.wasm b/extended-const/elem/elem.12.wasm new file mode 100644 index 00000000..4ece8ed1 Binary files /dev/null and b/extended-const/elem/elem.12.wasm differ diff --git a/extended-const/elem/elem.13.wasm b/extended-const/elem/elem.13.wasm new file mode 100644 index 00000000..a1726fbe Binary files /dev/null and b/extended-const/elem/elem.13.wasm differ diff --git a/extended-const/elem/elem.14.wasm b/extended-const/elem/elem.14.wasm new file mode 100644 index 00000000..bb833b24 Binary files /dev/null and b/extended-const/elem/elem.14.wasm differ diff --git a/extended-const/elem/elem.15.wasm b/extended-const/elem/elem.15.wasm new file mode 100644 index 00000000..9275bf73 Binary files /dev/null and b/extended-const/elem/elem.15.wasm differ diff --git a/extended-const/elem/elem.16.wasm b/extended-const/elem/elem.16.wasm new file mode 100644 index 00000000..67dbb349 Binary files /dev/null and b/extended-const/elem/elem.16.wasm differ diff --git a/extended-const/elem/elem.17.wasm b/extended-const/elem/elem.17.wasm new file mode 100644 index 00000000..3506d6ed Binary files /dev/null and b/extended-const/elem/elem.17.wasm differ diff --git a/extended-const/elem/elem.18.wasm b/extended-const/elem/elem.18.wasm new file mode 100644 index 00000000..9b750fca Binary files /dev/null and b/extended-const/elem/elem.18.wasm differ diff --git a/extended-const/elem/elem.19.wasm b/extended-const/elem/elem.19.wasm new file mode 100644 index 00000000..5b5ed0c7 Binary files /dev/null and b/extended-const/elem/elem.19.wasm differ diff --git a/extended-const/elem/elem.2.wasm b/extended-const/elem/elem.2.wasm new file mode 100644 index 00000000..df5fa30f Binary files /dev/null and b/extended-const/elem/elem.2.wasm differ diff --git a/extended-const/elem/elem.20.wasm b/extended-const/elem/elem.20.wasm new file mode 100644 index 00000000..301df73f Binary files /dev/null and b/extended-const/elem/elem.20.wasm differ diff --git a/extended-const/elem/elem.21.wasm b/extended-const/elem/elem.21.wasm new file mode 100644 index 00000000..4d1e8441 Binary files /dev/null and b/extended-const/elem/elem.21.wasm differ diff --git a/extended-const/elem/elem.22.wasm b/extended-const/elem/elem.22.wasm new file mode 100644 index 00000000..1b814947 Binary files /dev/null and b/extended-const/elem/elem.22.wasm differ diff --git a/extended-const/elem/elem.23.wasm b/extended-const/elem/elem.23.wasm new file mode 100644 index 00000000..a900630b Binary files /dev/null and b/extended-const/elem/elem.23.wasm differ diff --git a/extended-const/elem/elem.24.wasm b/extended-const/elem/elem.24.wasm new file mode 100644 index 00000000..81d76695 Binary files /dev/null and b/extended-const/elem/elem.24.wasm differ diff --git a/extended-const/elem/elem.25.wasm b/extended-const/elem/elem.25.wasm new file mode 100644 index 00000000..421a5ec7 Binary files /dev/null and b/extended-const/elem/elem.25.wasm differ diff --git a/extended-const/elem/elem.26.wasm b/extended-const/elem/elem.26.wasm new file mode 100644 index 00000000..3ed8ed32 Binary files /dev/null and b/extended-const/elem/elem.26.wasm differ diff --git a/extended-const/elem/elem.27.wasm b/extended-const/elem/elem.27.wasm new file mode 100644 index 00000000..27cb9b70 Binary files /dev/null and b/extended-const/elem/elem.27.wasm differ diff --git a/extended-const/elem/elem.28.wasm b/extended-const/elem/elem.28.wasm new file mode 100644 index 00000000..bdf0bf9e Binary files /dev/null and b/extended-const/elem/elem.28.wasm differ diff --git a/extended-const/elem/elem.29.wasm b/extended-const/elem/elem.29.wasm new file mode 100644 index 00000000..27cb9b70 Binary files /dev/null and b/extended-const/elem/elem.29.wasm differ diff --git a/extended-const/elem/elem.3.wasm b/extended-const/elem/elem.3.wasm new file mode 100644 index 00000000..5b83d936 Binary files /dev/null and b/extended-const/elem/elem.3.wasm differ diff --git a/extended-const/elem/elem.30.wasm b/extended-const/elem/elem.30.wasm new file mode 100644 index 00000000..7acf72e1 Binary files /dev/null and b/extended-const/elem/elem.30.wasm differ diff --git a/extended-const/elem/elem.31.wasm b/extended-const/elem/elem.31.wasm new file mode 100644 index 00000000..e1bcd3ee Binary files /dev/null and b/extended-const/elem/elem.31.wasm differ diff --git a/extended-const/elem/elem.32.wasm b/extended-const/elem/elem.32.wasm new file mode 100644 index 00000000..b4b768fb Binary files /dev/null and b/extended-const/elem/elem.32.wasm differ diff --git a/extended-const/elem/elem.33.wasm b/extended-const/elem/elem.33.wasm new file mode 100644 index 00000000..4f1cdd8e Binary files /dev/null and b/extended-const/elem/elem.33.wasm differ diff --git a/extended-const/elem/elem.34.wasm b/extended-const/elem/elem.34.wasm new file mode 100644 index 00000000..76f89edf Binary files /dev/null and b/extended-const/elem/elem.34.wasm differ diff --git a/extended-const/elem/elem.35.wasm b/extended-const/elem/elem.35.wasm new file mode 100644 index 00000000..a5fbacdb Binary files /dev/null and b/extended-const/elem/elem.35.wasm differ diff --git a/extended-const/elem/elem.36.wasm b/extended-const/elem/elem.36.wasm new file mode 100644 index 00000000..57f2049a Binary files /dev/null and b/extended-const/elem/elem.36.wasm differ diff --git a/extended-const/elem/elem.37.wasm b/extended-const/elem/elem.37.wasm new file mode 100644 index 00000000..d0d7cca6 Binary files /dev/null and b/extended-const/elem/elem.37.wasm differ diff --git a/extended-const/elem/elem.38.wasm b/extended-const/elem/elem.38.wasm new file mode 100644 index 00000000..2e56e095 Binary files /dev/null and b/extended-const/elem/elem.38.wasm differ diff --git a/extended-const/elem/elem.39.wasm b/extended-const/elem/elem.39.wasm new file mode 100644 index 00000000..4961f99c Binary files /dev/null and b/extended-const/elem/elem.39.wasm differ diff --git a/extended-const/elem/elem.4.wasm b/extended-const/elem/elem.4.wasm new file mode 100644 index 00000000..78af4cf1 Binary files /dev/null and b/extended-const/elem/elem.4.wasm differ diff --git a/extended-const/elem/elem.40.wasm b/extended-const/elem/elem.40.wasm new file mode 100644 index 00000000..9902698d Binary files /dev/null and b/extended-const/elem/elem.40.wasm differ diff --git a/extended-const/elem/elem.41.wasm b/extended-const/elem/elem.41.wasm new file mode 100644 index 00000000..d25c0fe3 Binary files /dev/null and b/extended-const/elem/elem.41.wasm differ diff --git a/extended-const/elem/elem.42.wasm b/extended-const/elem/elem.42.wasm new file mode 100644 index 00000000..351efbf8 Binary files /dev/null and b/extended-const/elem/elem.42.wasm differ diff --git a/extended-const/elem/elem.43.wasm b/extended-const/elem/elem.43.wasm new file mode 100644 index 00000000..4ae54a1b Binary files /dev/null and b/extended-const/elem/elem.43.wasm differ diff --git a/extended-const/elem/elem.44.wasm b/extended-const/elem/elem.44.wasm new file mode 100644 index 00000000..4308a9ed Binary files /dev/null and b/extended-const/elem/elem.44.wasm differ diff --git a/extended-const/elem/elem.45.wasm b/extended-const/elem/elem.45.wasm new file mode 100644 index 00000000..e473987c Binary files /dev/null and b/extended-const/elem/elem.45.wasm differ diff --git a/extended-const/elem/elem.46.wasm b/extended-const/elem/elem.46.wasm new file mode 100644 index 00000000..882b16dc Binary files /dev/null and b/extended-const/elem/elem.46.wasm differ diff --git a/extended-const/elem/elem.47.wasm b/extended-const/elem/elem.47.wasm new file mode 100644 index 00000000..7c251b86 Binary files /dev/null and b/extended-const/elem/elem.47.wasm differ diff --git a/extended-const/elem/elem.48.wasm b/extended-const/elem/elem.48.wasm new file mode 100644 index 00000000..bbe414a1 Binary files /dev/null and b/extended-const/elem/elem.48.wasm differ diff --git a/extended-const/elem/elem.49.wasm b/extended-const/elem/elem.49.wasm new file mode 100644 index 00000000..9b320f41 Binary files /dev/null and b/extended-const/elem/elem.49.wasm differ diff --git a/extended-const/elem/elem.5.wasm b/extended-const/elem/elem.5.wasm new file mode 100644 index 00000000..dc502877 Binary files /dev/null and b/extended-const/elem/elem.5.wasm differ diff --git a/extended-const/elem/elem.50.wasm b/extended-const/elem/elem.50.wasm new file mode 100644 index 00000000..4b8a7689 Binary files /dev/null and b/extended-const/elem/elem.50.wasm differ diff --git a/extended-const/elem/elem.51.wasm b/extended-const/elem/elem.51.wasm new file mode 100644 index 00000000..f7cde626 Binary files /dev/null and b/extended-const/elem/elem.51.wasm differ diff --git a/extended-const/elem/elem.52.wasm b/extended-const/elem/elem.52.wasm new file mode 100644 index 00000000..3eb719f4 Binary files /dev/null and b/extended-const/elem/elem.52.wasm differ diff --git a/extended-const/elem/elem.53.wasm b/extended-const/elem/elem.53.wasm new file mode 100644 index 00000000..6ffdec2e Binary files /dev/null and b/extended-const/elem/elem.53.wasm differ diff --git a/extended-const/elem/elem.54.wasm b/extended-const/elem/elem.54.wasm new file mode 100644 index 00000000..6ffdec2e Binary files /dev/null and b/extended-const/elem/elem.54.wasm differ diff --git a/extended-const/elem/elem.55.wasm b/extended-const/elem/elem.55.wasm new file mode 100644 index 00000000..351f90fb Binary files /dev/null and b/extended-const/elem/elem.55.wasm differ diff --git a/extended-const/elem/elem.56.wasm b/extended-const/elem/elem.56.wasm new file mode 100644 index 00000000..0826ec48 Binary files /dev/null and b/extended-const/elem/elem.56.wasm differ diff --git a/extended-const/elem/elem.57.wasm b/extended-const/elem/elem.57.wasm new file mode 100644 index 00000000..5fc0f79e Binary files /dev/null and b/extended-const/elem/elem.57.wasm differ diff --git a/extended-const/elem/elem.58.wasm b/extended-const/elem/elem.58.wasm new file mode 100644 index 00000000..258518c6 Binary files /dev/null and b/extended-const/elem/elem.58.wasm differ diff --git a/extended-const/elem/elem.59.wasm b/extended-const/elem/elem.59.wasm new file mode 100644 index 00000000..d6867c72 Binary files /dev/null and b/extended-const/elem/elem.59.wasm differ diff --git a/extended-const/elem/elem.6.wasm b/extended-const/elem/elem.6.wasm new file mode 100644 index 00000000..e377d5f6 Binary files /dev/null and b/extended-const/elem/elem.6.wasm differ diff --git a/extended-const/elem/elem.60.wasm b/extended-const/elem/elem.60.wasm new file mode 100644 index 00000000..f19a2950 Binary files /dev/null and b/extended-const/elem/elem.60.wasm differ diff --git a/extended-const/elem/elem.61.wasm b/extended-const/elem/elem.61.wasm new file mode 100644 index 00000000..ec6c024d Binary files /dev/null and b/extended-const/elem/elem.61.wasm differ diff --git a/extended-const/elem/elem.62.wasm b/extended-const/elem/elem.62.wasm new file mode 100644 index 00000000..6837acfb Binary files /dev/null and b/extended-const/elem/elem.62.wasm differ diff --git a/extended-const/elem/elem.63.wasm b/extended-const/elem/elem.63.wasm new file mode 100644 index 00000000..ee41e7b9 Binary files /dev/null and b/extended-const/elem/elem.63.wasm differ diff --git a/extended-const/elem/elem.64.wasm b/extended-const/elem/elem.64.wasm new file mode 100644 index 00000000..50595851 Binary files /dev/null and b/extended-const/elem/elem.64.wasm differ diff --git a/extended-const/elem/elem.65.wasm b/extended-const/elem/elem.65.wasm new file mode 100644 index 00000000..57e363bd Binary files /dev/null and b/extended-const/elem/elem.65.wasm differ diff --git a/extended-const/elem/elem.66.wasm b/extended-const/elem/elem.66.wasm new file mode 100644 index 00000000..98e573f3 Binary files /dev/null and b/extended-const/elem/elem.66.wasm differ diff --git a/extended-const/elem/elem.67.wasm b/extended-const/elem/elem.67.wasm new file mode 100644 index 00000000..771fd598 Binary files /dev/null and b/extended-const/elem/elem.67.wasm differ diff --git a/extended-const/elem/elem.68.wasm b/extended-const/elem/elem.68.wasm new file mode 100644 index 00000000..1cd3b682 Binary files /dev/null and b/extended-const/elem/elem.68.wasm differ diff --git a/extended-const/elem/elem.69.wasm b/extended-const/elem/elem.69.wasm new file mode 100644 index 00000000..a40618e0 Binary files /dev/null and b/extended-const/elem/elem.69.wasm differ diff --git a/extended-const/elem/elem.7.wasm b/extended-const/elem/elem.7.wasm new file mode 100644 index 00000000..e377d5f6 Binary files /dev/null and b/extended-const/elem/elem.7.wasm differ diff --git a/extended-const/elem/elem.8.wasm b/extended-const/elem/elem.8.wasm new file mode 100644 index 00000000..2cca27ec Binary files /dev/null and b/extended-const/elem/elem.8.wasm differ diff --git a/extended-const/elem/elem.9.wasm b/extended-const/elem/elem.9.wasm new file mode 100644 index 00000000..1ceb39c4 Binary files /dev/null and b/extended-const/elem/elem.9.wasm differ diff --git a/extended-const/elem/elem.json b/extended-const/elem/elem.json new file mode 100644 index 00000000..41d4bf59 --- /dev/null +++ b/extended-const/elem/elem.json @@ -0,0 +1,101 @@ +{"source_filename": "elem.wast", + "commands": [ + {"type": "module", "line": 4, "filename": "elem.0.wasm"}, + {"type": "module", "line": 80, "filename": "elem.1.wasm"}, + {"type": "module", "line": 90, "filename": "elem.2.wasm"}, + {"type": "module", "line": 95, "filename": "elem.3.wasm"}, + {"type": "module", "line": 101, "filename": "elem.4.wasm"}, + {"type": "module", "line": 110, "filename": "elem.5.wasm"}, + {"type": "module", "line": 120, "filename": "elem.6.wasm"}, + {"type": "module", "line": 127, "filename": "elem.7.wasm"}, + {"type": "module", "line": 134, "filename": "elem.8.wasm"}, + {"type": "assert_return", "line": 148, "action": {"type": "invoke", "field": "call-7", "args": []}, "expected": [{"type": "i32", "value": "65"}]}, + {"type": "assert_return", "line": 149, "action": {"type": "invoke", "field": "call-9", "args": []}, "expected": [{"type": "i32", "value": "66"}]}, + {"type": "module", "line": 153, "filename": "elem.9.wasm"}, + {"type": "assert_return", "line": 167, "action": {"type": "invoke", "field": "call-7", "args": []}, "expected": [{"type": "i32", "value": "65"}]}, + {"type": "assert_return", "line": 168, "action": {"type": "invoke", "field": "call-9", "args": []}, "expected": [{"type": "i32", "value": "66"}]}, + {"type": "assert_invalid", "line": 171, "filename": "elem.10.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 175, "filename": "elem.11.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "module", "line": 182, "filename": "elem.12.wasm"}, + {"type": "module", "line": 187, "filename": "elem.13.wasm"}, + {"type": "module", "line": 193, "filename": "elem.14.wasm"}, + {"type": "module", "line": 197, "filename": "elem.15.wasm"}, + {"type": "module", "line": 202, "filename": "elem.16.wasm"}, + {"type": "module", "line": 207, "filename": "elem.17.wasm"}, + {"type": "module", "line": 212, "filename": "elem.18.wasm"}, + {"type": "module", "line": 218, "filename": "elem.19.wasm"}, + {"type": "module", "line": 224, "filename": "elem.20.wasm"}, + {"type": "module", "line": 230, "filename": "elem.21.wasm"}, + {"type": "assert_uninstantiable", "line": 239, "filename": "elem.22.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 248, "filename": "elem.23.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 257, "filename": "elem.24.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 266, "filename": "elem.25.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 273, "filename": "elem.26.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 281, "filename": "elem.27.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 290, "filename": "elem.28.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 298, "filename": "elem.29.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 307, "filename": "elem.30.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 315, "filename": "elem.31.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 324, "filename": "elem.32.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "assert_uninstantiable", "line": 332, "filename": "elem.33.wasm", "text": "out of bounds table access", "module_type": "binary"}, + {"type": "module", "line": 342, "filename": "elem.34.wasm"}, + {"type": "assert_trap", "line": 350, "action": {"type": "invoke", "field": "init", "args": []}, "text": "out of bounds table access", "expected": []}, + {"type": "module", "line": 352, "filename": "elem.35.wasm"}, + {"type": "assert_trap", "line": 360, "action": {"type": "invoke", "field": "init", "args": []}, "text": "out of bounds table access", "expected": []}, + {"type": "assert_invalid", "line": 365, "filename": "elem.36.wasm", "text": "unknown table", "module_type": "binary"}, + {"type": "assert_invalid", "line": 375, "filename": "elem.37.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 383, "filename": "elem.38.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 391, "filename": "elem.39.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 399, "filename": "elem.40.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 407, "filename": "elem.41.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 416, "filename": "elem.42.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 426, "filename": "elem.43.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 434, "filename": "elem.44.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 442, "filename": "elem.45.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 450, "filename": "elem.46.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 458, "filename": "elem.47.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 467, "filename": "elem.48.wasm", "text": "unknown global 0", "module_type": "binary"}, + {"type": "assert_invalid", "line": 475, "filename": "elem.49.wasm", "text": "unknown global 1", "module_type": "binary"}, + {"type": "assert_invalid", "line": 484, "filename": "elem.50.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 495, "filename": "elem.51.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 503, "filename": "elem.52.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 511, "filename": "elem.53.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 519, "filename": "elem.54.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 527, "filename": "elem.55.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 536, "filename": "elem.56.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "module", "line": 546, "filename": "elem.57.wasm"}, + {"type": "assert_return", "line": 557, "action": {"type": "invoke", "field": "call-overwritten", "args": []}, "expected": [{"type": "i32", "value": "66"}]}, + {"type": "module", "line": 559, "filename": "elem.58.wasm"}, + {"type": "assert_return", "line": 570, "action": {"type": "invoke", "field": "call-overwritten-element", "args": []}, "expected": [{"type": "i32", "value": "66"}]}, + {"type": "module", "line": 574, "name": "$module1", "filename": "elem.59.wasm"}, + {"type": "register", "line": 592, "name": "$module1", "as": "module1"}, + {"type": "assert_trap", "line": 594, "action": {"type": "invoke", "module": "$module1", "field": "call-7", "args": []}, "text": "uninitialized element", "expected": [{"type": "i32"}]}, + {"type": "assert_return", "line": 595, "action": {"type": "invoke", "module": "$module1", "field": "call-8", "args": []}, "expected": [{"type": "i32", "value": "65"}]}, + {"type": "assert_return", "line": 596, "action": {"type": "invoke", "module": "$module1", "field": "call-9", "args": []}, "expected": [{"type": "i32", "value": "66"}]}, + {"type": "module", "line": 598, "name": "$module2", "filename": "elem.60.wasm"}, + {"type": "assert_return", "line": 607, "action": {"type": "invoke", "module": "$module1", "field": "call-7", "args": []}, "expected": [{"type": "i32", "value": "67"}]}, + {"type": "assert_return", "line": 608, "action": {"type": "invoke", "module": "$module1", "field": "call-8", "args": []}, "expected": [{"type": "i32", "value": "68"}]}, + {"type": "assert_return", "line": 609, "action": {"type": "invoke", "module": "$module1", "field": "call-9", "args": []}, "expected": [{"type": "i32", "value": "66"}]}, + {"type": "module", "line": 611, "name": "$module3", "filename": "elem.61.wasm"}, + {"type": "assert_return", "line": 620, "action": {"type": "invoke", "module": "$module1", "field": "call-7", "args": []}, "expected": [{"type": "i32", "value": "67"}]}, + {"type": "assert_return", "line": 621, "action": {"type": "invoke", "module": "$module1", "field": "call-8", "args": []}, "expected": [{"type": "i32", "value": "69"}]}, + {"type": "assert_return", "line": 622, "action": {"type": "invoke", "module": "$module1", "field": "call-9", "args": []}, "expected": [{"type": "i32", "value": "70"}]}, + {"type": "assert_invalid", "line": 627, "filename": "elem.62.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 632, "filename": "elem.63.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 637, "filename": "elem.64.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 646, "filename": "elem.65.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "module", "line": 655, "name": "$m", "filename": "elem.66.wasm"}, + {"type": "register", "line": 662, "name": "$m", "as": "exporter"}, + {"type": "assert_return", "line": 664, "action": {"type": "invoke", "module": "$m", "field": "get", "args": [{"type": "i32", "value": "0"}]}, "expected": [{"type": "externref", "value": "null"}]}, + {"type": "assert_return", "line": 665, "action": {"type": "invoke", "module": "$m", "field": "get", "args": [{"type": "i32", "value": "1"}]}, "expected": [{"type": "externref", "value": "null"}]}, + {"type": "assert_return", "line": 667, "action": {"type": "invoke", "module": "$m", "field": "set", "args": [{"type": "i32", "value": "0"}, {"type": "externref", "value": "42"}]}, "expected": []}, + {"type": "assert_return", "line": 668, "action": {"type": "invoke", "module": "$m", "field": "set", "args": [{"type": "i32", "value": "1"}, {"type": "externref", "value": "137"}]}, "expected": []}, + {"type": "assert_return", "line": 670, "action": {"type": "invoke", "module": "$m", "field": "get", "args": [{"type": "i32", "value": "0"}]}, "expected": [{"type": "externref", "value": "42"}]}, + {"type": "assert_return", "line": 671, "action": {"type": "invoke", "module": "$m", "field": "get", "args": [{"type": "i32", "value": "1"}]}, "expected": [{"type": "externref", "value": "137"}]}, + {"type": "module", "line": 673, "filename": "elem.67.wasm"}, + {"type": "assert_return", "line": 677, "action": {"type": "invoke", "module": "$m", "field": "get", "args": [{"type": "i32", "value": "0"}]}, "expected": [{"type": "externref", "value": "null"}]}, + {"type": "assert_return", "line": 678, "action": {"type": "invoke", "module": "$m", "field": "get", "args": [{"type": "i32", "value": "1"}]}, "expected": [{"type": "externref", "value": "137"}]}, + {"type": "module", "line": 682, "name": "$module4", "filename": "elem.68.wasm"}, + {"type": "register", "line": 689, "name": "$module4", "as": "module4"}, + {"type": "module", "line": 691, "filename": "elem.69.wasm"}, + {"type": "assert_return", "line": 701, "action": {"type": "invoke", "field": "call_imported_elem", "args": []}, "expected": [{"type": "i32", "value": "42"}]}]} diff --git a/extended-const/elem/elem.wast b/extended-const/elem/elem.wast new file mode 100644 index 00000000..6e7a33af --- /dev/null +++ b/extended-const/elem/elem.wast @@ -0,0 +1,701 @@ +;; Test the element section + +;; Syntax +(module + (table $t 10 funcref) + (func $f) + (func $g) + + ;; Passive + (elem funcref) + (elem funcref (ref.func $f) (item ref.func $f) (item (ref.null func)) (ref.func $g)) + (elem func) + (elem func $f $f $g $g) + + (elem $p1 funcref) + (elem $p2 funcref (ref.func $f) (ref.func $f) (ref.null func) (ref.func $g)) + (elem $p3 func) + (elem $p4 func $f $f $g $g) + + ;; Active + (elem (table $t) (i32.const 0) funcref) + (elem (table $t) (i32.const 0) funcref (ref.func $f) (ref.null func)) + (elem (table $t) (i32.const 0) func) + (elem (table $t) (i32.const 0) func $f $g) + (elem (table $t) (offset (i32.const 0)) funcref) + (elem (table $t) (offset (i32.const 0)) func $f $g) + (elem (table 0) (i32.const 0) func) + (elem (table 0x0) (i32.const 0) func $f $f) + (elem (table 0x000) (offset (i32.const 0)) func) + (elem (table 0) (offset (i32.const 0)) func $f $f) + (elem (table $t) (i32.const 0) func) + (elem (table $t) (i32.const 0) func $f $f) + (elem (table $t) (offset (i32.const 0)) func) + (elem (table $t) (offset (i32.const 0)) func $f $f) + (elem (offset (i32.const 0))) + (elem (offset (i32.const 0)) funcref (ref.func $f) (ref.null func)) + (elem (offset (i32.const 0)) func $f $f) + (elem (offset (i32.const 0)) $f $f) + (elem (i32.const 0)) + (elem (i32.const 0) funcref (ref.func $f) (ref.null func)) + (elem (i32.const 0) func $f $f) + (elem (i32.const 0) $f $f) + (elem (i32.const 0) funcref (item (ref.func $f)) (item (ref.null func))) + + (elem $a1 (table $t) (i32.const 0) funcref) + (elem $a2 (table $t) (i32.const 0) funcref (ref.func $f) (ref.null func)) + (elem $a3 (table $t) (i32.const 0) func) + (elem $a4 (table $t) (i32.const 0) func $f $g) + (elem $a9 (table $t) (offset (i32.const 0)) funcref) + (elem $a10 (table $t) (offset (i32.const 0)) func $f $g) + (elem $a11 (table 0) (i32.const 0) func) + (elem $a12 (table 0x0) (i32.const 0) func $f $f) + (elem $a13 (table 0x000) (offset (i32.const 0)) func) + (elem $a14 (table 0) (offset (i32.const 0)) func $f $f) + (elem $a15 (table $t) (i32.const 0) func) + (elem $a16 (table $t) (i32.const 0) func $f $f) + (elem $a17 (table $t) (offset (i32.const 0)) func) + (elem $a18 (table $t) (offset (i32.const 0)) func $f $f) + (elem $a19 (offset (i32.const 0))) + (elem $a20 (offset (i32.const 0)) funcref (ref.func $f) (ref.null func)) + (elem $a21 (offset (i32.const 0)) func $f $f) + (elem $a22 (offset (i32.const 0)) $f $f) + (elem $a23 (i32.const 0)) + (elem $a24 (i32.const 0) funcref (ref.func $f) (ref.null func)) + (elem $a25 (i32.const 0) func $f $f) + (elem $a26 (i32.const 0) $f $f) + + ;; Declarative + (elem declare funcref) + (elem declare funcref (ref.func $f) (ref.func $f) (ref.null func) (ref.func $g)) + (elem declare func) + (elem declare func $f $f $g $g) + + (elem $d1 declare funcref) + (elem $d2 declare funcref (ref.func $f) (ref.func $f) (ref.null func) (ref.func $g)) + (elem $d3 declare func) + (elem $d4 declare func $f $f $g $g) +) + +(module + (func $f) + (func $g) + + (table $t funcref (elem (ref.func $f) (ref.null func) (ref.func $g))) +) + + +;; Basic use + +(module + (table 10 funcref) + (func $f) + (elem (i32.const 0) $f) +) +(module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const 0) $f) +) + +(module + (table 10 funcref) + (func $f) + (elem (i32.const 0) $f) + (elem (i32.const 3) $f) + (elem (i32.const 7) $f) + (elem (i32.const 5) $f) + (elem (i32.const 3) $f) +) +(module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const 9) $f) + (elem (i32.const 3) $f) + (elem (i32.const 7) $f) + (elem (i32.const 3) $f) + (elem (i32.const 5) $f) +) + +(module + (global (import "spectest" "global_i32") i32) + (table 1000 funcref) + (func $f) + (elem (global.get 0) $f) +) + +(module + (global $g (import "spectest" "global_i32") i32) + (table 1000 funcref) + (func $f) + (elem (global.get $g) $f) +) + +(module + (type $out-i32 (func (result i32))) + (table 10 funcref) + (elem (i32.const 7) $const-i32-a) + (elem (i32.const 9) $const-i32-b) + (func $const-i32-a (type $out-i32) (i32.const 65)) + (func $const-i32-b (type $out-i32) (i32.const 66)) + (func (export "call-7") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 7)) + ) + (func (export "call-9") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 9)) + ) +) +(assert_return (invoke "call-7") (i32.const 65)) +(assert_return (invoke "call-9") (i32.const 66)) + +;; Same as the above, but use ref.null to ensure the elements use exprs. +;; Note: some tools like wast2json avoid using exprs when possible. +(module + (type $out-i32 (func (result i32))) + (table 11 funcref) + (elem (i32.const 6) funcref (ref.null func) (ref.func $const-i32-a)) + (elem (i32.const 9) funcref (ref.func $const-i32-b) (ref.null func)) + (func $const-i32-a (type $out-i32) (i32.const 65)) + (func $const-i32-b (type $out-i32) (i32.const 66)) + (func (export "call-7") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 7)) + ) + (func (export "call-9") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 9)) + ) +) +(assert_return (invoke "call-7") (i32.const 65)) +(assert_return (invoke "call-9") (i32.const 66)) + +(assert_invalid + (module (table 1 funcref) (global i32 (i32.const 0)) (elem (global.get 0) $f) (func $f)) + "unknown global" +) +(assert_invalid + (module (table 1 funcref) (global $g i32 (i32.const 0)) (elem (global.get $g) $f) (func $f)) + "unknown global" +) + + +;; Corner cases + +(module + (table 10 funcref) + (func $f) + (elem (i32.const 9) $f) +) +(module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const 9) $f) +) + +(module + (table 0 funcref) + (elem (i32.const 0)) +) +(module + (import "spectest" "table" (table 0 funcref)) + (elem (i32.const 0)) +) + +(module + (table 0 0 funcref) + (elem (i32.const 0)) +) + +(module + (table 20 funcref) + (elem (i32.const 20)) +) + +(module + (import "spectest" "table" (table 0 funcref)) + (func $f) + (elem (i32.const 0) $f) +) + +(module + (import "spectest" "table" (table 0 100 funcref)) + (func $f) + (elem (i32.const 0) $f) +) + +(module + (import "spectest" "table" (table 0 funcref)) + (func $f) + (elem (i32.const 1) $f) +) + +(module + (import "spectest" "table" (table 0 30 funcref)) + (func $f) + (elem (i32.const 1) $f) +) + +;; Invalid bounds for elements + +(assert_trap + (module + (table 0 funcref) + (func $f) + (elem (i32.const 0) $f) + ) + "out of bounds table access" +) + +(assert_trap + (module + (table 0 0 funcref) + (func $f) + (elem (i32.const 0) $f) + ) + "out of bounds table access" +) + +(assert_trap + (module + (table 0 1 funcref) + (func $f) + (elem (i32.const 0) $f) + ) + "out of bounds table access" +) + +(assert_trap + (module + (table 0 funcref) + (elem (i32.const 1)) + ) + "out of bounds table access" +) +(assert_trap + (module + (table 10 funcref) + (func $f) + (elem (i32.const 10) $f) + ) + "out of bounds table access" +) +(assert_trap + (module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const 10) $f) + ) + "out of bounds table access" +) + +(assert_trap + (module + (table 10 20 funcref) + (func $f) + (elem (i32.const 10) $f) + ) + "out of bounds table access" +) +(assert_trap + (module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const 10) $f) + ) + "out of bounds table access" +) + +(assert_trap + (module + (table 10 funcref) + (func $f) + (elem (i32.const -1) $f) + ) + "out of bounds table access" +) +(assert_trap + (module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const -1) $f) + ) + "out of bounds table access" +) + +(assert_trap + (module + (table 10 funcref) + (func $f) + (elem (i32.const -10) $f) + ) + "out of bounds table access" +) +(assert_trap + (module + (import "spectest" "table" (table 10 funcref)) + (func $f) + (elem (i32.const -10) $f) + ) + "out of bounds table access" +) + +;; Implicitly dropped elements + +(module + (table 10 funcref) + (elem $e (i32.const 0) func $f) + (func $f) + (func (export "init") + (table.init $e (i32.const 0) (i32.const 0) (i32.const 1)) + ) +) +(assert_trap (invoke "init") "out of bounds table access") + +(module + (table 10 funcref) + (elem $e declare func $f) + (func $f) + (func (export "init") + (table.init $e (i32.const 0) (i32.const 0) (i32.const 1)) + ) +) +(assert_trap (invoke "init") "out of bounds table access") + +;; Element without table + +(assert_invalid + (module + (func $f) + (elem (i32.const 0) $f) + ) + "unknown table" +) + +;; Invalid offsets + +(assert_invalid + (module + (table 1 funcref) + (elem (i64.const 0)) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (ref.null func)) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (offset (;empty instruction sequence;))) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (offset (i32.const 0) (i32.const 0))) + ) + "type mismatch" +) + +(assert_invalid + (module + (global (import "test" "global-i32") i32) + (table 1 funcref) + (elem (offset (global.get 0) (global.get 0))) + ) + "type mismatch" +) + +(assert_invalid + (module + (global (import "test" "global-i32") i32) + (table 1 funcref) + (elem (offset (global.get 0) (i32.const 0))) + ) + "type mismatch" +) + + +(assert_invalid + (module + (table 1 funcref) + (elem (i32.ctz (i32.const 0))) + ) + "constant expression required" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (nop)) + ) + "constant expression required" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (offset (nop) (i32.const 0))) + ) + "constant expression required" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (offset (i32.const 0) (nop))) + ) + "constant expression required" +) + +(assert_invalid + (module + (global $g (import "test" "g") (mut i32)) + (table 1 funcref) + (elem (global.get $g)) + ) + "constant expression required" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (global.get 0)) + ) + "unknown global 0" +) + +(assert_invalid + (module + (global (import "test" "global-i32") i32) + (table 1 funcref) + (elem (global.get 1)) + ) + "unknown global 1" +) + +(assert_invalid + (module + (global (import "test" "global-mut-i32") (mut i32)) + (table 1 funcref) + (elem (global.get 0)) + ) + "constant expression required" +) + +;; Invalid elements + +(assert_invalid + (module + (table 1 funcref) + (elem (i32.const 0) funcref (ref.null extern)) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (i32.const 0) funcref (item (ref.null func) (ref.null func))) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (i32.const 0) funcref (i32.const 0)) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (i32.const 0) funcref (item (i32.const 0))) + ) + "type mismatch" +) + +(assert_invalid + (module + (table 1 funcref) + (elem (i32.const 0) funcref (item (call $f))) + (func $f (result funcref) (ref.null func)) + ) + "constant expression required" +) + +(assert_invalid + (module + (func $f (result i32) (i32.const 9)) + (table 1 funcref) + (elem (i32.const 0) funcref (item (call $f))) + ) + "constant expression required" +) + +;; Two elements target the same slot + +(module + (type $out-i32 (func (result i32))) + (table 10 funcref) + (elem (i32.const 9) $const-i32-a) + (elem (i32.const 9) $const-i32-b) + (func $const-i32-a (type $out-i32) (i32.const 65)) + (func $const-i32-b (type $out-i32) (i32.const 66)) + (func (export "call-overwritten") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 9)) + ) +) +(assert_return (invoke "call-overwritten") (i32.const 66)) + +(module + (type $out-i32 (func (result i32))) + (import "spectest" "table" (table 10 funcref)) + (elem (i32.const 9) $const-i32-a) + (elem (i32.const 9) $const-i32-b) + (func $const-i32-a (type $out-i32) (i32.const 65)) + (func $const-i32-b (type $out-i32) (i32.const 66)) + (func (export "call-overwritten-element") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 9)) + ) +) +(assert_return (invoke "call-overwritten-element") (i32.const 66)) + +;; Element sections across multiple modules change the same table + +(module $module1 + (type $out-i32 (func (result i32))) + (table (export "shared-table") 10 funcref) + (elem (i32.const 8) $const-i32-a) + (elem (i32.const 9) $const-i32-b) + (func $const-i32-a (type $out-i32) (i32.const 65)) + (func $const-i32-b (type $out-i32) (i32.const 66)) + (func (export "call-7") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 7)) + ) + (func (export "call-8") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 8)) + ) + (func (export "call-9") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 9)) + ) +) + +(register "module1" $module1) + +(assert_trap (invoke $module1 "call-7") "uninitialized element") +(assert_return (invoke $module1 "call-8") (i32.const 65)) +(assert_return (invoke $module1 "call-9") (i32.const 66)) + +(module $module2 + (type $out-i32 (func (result i32))) + (import "module1" "shared-table" (table 10 funcref)) + (elem (i32.const 7) $const-i32-c) + (elem (i32.const 8) $const-i32-d) + (func $const-i32-c (type $out-i32) (i32.const 67)) + (func $const-i32-d (type $out-i32) (i32.const 68)) +) + +(assert_return (invoke $module1 "call-7") (i32.const 67)) +(assert_return (invoke $module1 "call-8") (i32.const 68)) +(assert_return (invoke $module1 "call-9") (i32.const 66)) + +(module $module3 + (type $out-i32 (func (result i32))) + (import "module1" "shared-table" (table 10 funcref)) + (elem (i32.const 8) $const-i32-e) + (elem (i32.const 9) $const-i32-f) + (func $const-i32-e (type $out-i32) (i32.const 69)) + (func $const-i32-f (type $out-i32) (i32.const 70)) +) + +(assert_return (invoke $module1 "call-7") (i32.const 67)) +(assert_return (invoke $module1 "call-8") (i32.const 69)) +(assert_return (invoke $module1 "call-9") (i32.const 70)) + +;; Element segments must match element type of table + +(assert_invalid + (module (func $f) (table 1 externref) (elem (i32.const 0) $f)) + "type mismatch" +) + +(assert_invalid + (module (table 1 funcref) (elem (i32.const 0) externref (ref.null extern))) + "type mismatch" +) + +(assert_invalid + (module + (func $f) + (table $t 1 externref) + (elem $e funcref (ref.func $f)) + (func (table.init $t $e (i32.const 0) (i32.const 0) (i32.const 1)))) + "type mismatch" +) + +(assert_invalid + (module + (table $t 1 funcref) + (elem $e externref (ref.null extern)) + (func (table.init $t $e (i32.const 0) (i32.const 0) (i32.const 1)))) + "type mismatch" +) + +;; Initializing a table with an externref-type element segment + +(module $m + (table $t (export "table") 2 externref) + (func (export "get") (param $i i32) (result externref) + (table.get $t (local.get $i))) + (func (export "set") (param $i i32) (param $x externref) + (table.set $t (local.get $i) (local.get $x)))) + +(register "exporter" $m) + +(assert_return (invoke $m "get" (i32.const 0)) (ref.null extern)) +(assert_return (invoke $m "get" (i32.const 1)) (ref.null extern)) + +(assert_return (invoke $m "set" (i32.const 0) (ref.extern 42))) +(assert_return (invoke $m "set" (i32.const 1) (ref.extern 137))) + +(assert_return (invoke $m "get" (i32.const 0)) (ref.extern 42)) +(assert_return (invoke $m "get" (i32.const 1)) (ref.extern 137)) + +(module + (import "exporter" "table" (table $t 2 externref)) + (elem (i32.const 0) externref (ref.null extern))) + +(assert_return (invoke $m "get" (i32.const 0)) (ref.null extern)) +(assert_return (invoke $m "get" (i32.const 1)) (ref.extern 137)) + +;; Initializing a table with imported funcref global + +(module $module4 + (func (result i32) + i32.const 42 + ) + (global (export "f") funcref (ref.func 0)) +) + +(register "module4" $module4) + +(module + (import "module4" "f" (global funcref)) + (type $out-i32 (func (result i32))) + (table 10 funcref) + (elem (offset (i32.const 0)) funcref (global.get 0)) + (func (export "call_imported_elem") (type $out-i32) + (call_indirect (type $out-i32) (i32.const 0)) + ) +) + +(assert_return (invoke "call_imported_elem") (i32.const 42)) diff --git a/extended-const/global/global.0.wasm b/extended-const/global/global.0.wasm new file mode 100644 index 00000000..7858f7ae Binary files /dev/null and b/extended-const/global/global.0.wasm differ diff --git a/extended-const/global/global.1.wasm b/extended-const/global/global.1.wasm new file mode 100644 index 00000000..51b90abd Binary files /dev/null and b/extended-const/global/global.1.wasm differ diff --git a/extended-const/global/global.10.wasm b/extended-const/global/global.10.wasm new file mode 100644 index 00000000..a9daf346 Binary files /dev/null and b/extended-const/global/global.10.wasm differ diff --git a/extended-const/global/global.11.wasm b/extended-const/global/global.11.wasm new file mode 100644 index 00000000..20256f8a Binary files /dev/null and b/extended-const/global/global.11.wasm differ diff --git a/extended-const/global/global.12.wasm b/extended-const/global/global.12.wasm new file mode 100644 index 00000000..a0742e8e Binary files /dev/null and b/extended-const/global/global.12.wasm differ diff --git a/extended-const/global/global.13.wasm b/extended-const/global/global.13.wasm new file mode 100644 index 00000000..1989dd44 Binary files /dev/null and b/extended-const/global/global.13.wasm differ diff --git a/extended-const/global/global.14.wasm b/extended-const/global/global.14.wasm new file mode 100644 index 00000000..0c44cc1b Binary files /dev/null and b/extended-const/global/global.14.wasm differ diff --git a/extended-const/global/global.15.wasm b/extended-const/global/global.15.wasm new file mode 100644 index 00000000..1e931600 Binary files /dev/null and b/extended-const/global/global.15.wasm differ diff --git a/extended-const/global/global.16.wasm b/extended-const/global/global.16.wasm new file mode 100644 index 00000000..7482aeb6 Binary files /dev/null and b/extended-const/global/global.16.wasm differ diff --git a/extended-const/global/global.17.wasm b/extended-const/global/global.17.wasm new file mode 100644 index 00000000..c2080852 Binary files /dev/null and b/extended-const/global/global.17.wasm differ diff --git a/extended-const/global/global.18.wasm b/extended-const/global/global.18.wasm new file mode 100644 index 00000000..82f6b95c Binary files /dev/null and b/extended-const/global/global.18.wasm differ diff --git a/extended-const/global/global.19.wasm b/extended-const/global/global.19.wasm new file mode 100644 index 00000000..82f6b95c Binary files /dev/null and b/extended-const/global/global.19.wasm differ diff --git a/extended-const/global/global.2.wasm b/extended-const/global/global.2.wasm new file mode 100644 index 00000000..db899e1d Binary files /dev/null and b/extended-const/global/global.2.wasm differ diff --git a/extended-const/global/global.20.wasm b/extended-const/global/global.20.wasm new file mode 100644 index 00000000..ec156cfd Binary files /dev/null and b/extended-const/global/global.20.wasm differ diff --git a/extended-const/global/global.21.wasm b/extended-const/global/global.21.wasm new file mode 100644 index 00000000..07b59aac Binary files /dev/null and b/extended-const/global/global.21.wasm differ diff --git a/extended-const/global/global.22.wasm b/extended-const/global/global.22.wasm new file mode 100644 index 00000000..8c2284f7 Binary files /dev/null and b/extended-const/global/global.22.wasm differ diff --git a/extended-const/global/global.23.wasm b/extended-const/global/global.23.wasm new file mode 100644 index 00000000..4b98efd1 Binary files /dev/null and b/extended-const/global/global.23.wasm differ diff --git a/extended-const/global/global.24.wasm b/extended-const/global/global.24.wasm new file mode 100644 index 00000000..f6e96259 Binary files /dev/null and b/extended-const/global/global.24.wasm differ diff --git a/extended-const/global/global.25.wasm b/extended-const/global/global.25.wasm new file mode 100644 index 00000000..dd30818b Binary files /dev/null and b/extended-const/global/global.25.wasm differ diff --git a/extended-const/global/global.26.wasm b/extended-const/global/global.26.wasm new file mode 100644 index 00000000..f634698e Binary files /dev/null and b/extended-const/global/global.26.wasm differ diff --git a/extended-const/global/global.27.wasm b/extended-const/global/global.27.wasm new file mode 100644 index 00000000..e49f6684 Binary files /dev/null and b/extended-const/global/global.27.wasm differ diff --git a/extended-const/global/global.28.wasm b/extended-const/global/global.28.wasm new file mode 100644 index 00000000..f7f54b88 Binary files /dev/null and b/extended-const/global/global.28.wasm differ diff --git a/extended-const/global/global.29.wasm b/extended-const/global/global.29.wasm new file mode 100644 index 00000000..95d1e550 Binary files /dev/null and b/extended-const/global/global.29.wasm differ diff --git a/extended-const/global/global.3.wasm b/extended-const/global/global.3.wasm new file mode 100644 index 00000000..638420f5 Binary files /dev/null and b/extended-const/global/global.3.wasm differ diff --git a/extended-const/global/global.30.wasm b/extended-const/global/global.30.wasm new file mode 100644 index 00000000..a7193d18 Binary files /dev/null and b/extended-const/global/global.30.wasm differ diff --git a/extended-const/global/global.31.wasm b/extended-const/global/global.31.wasm new file mode 100644 index 00000000..6db8cec1 Binary files /dev/null and b/extended-const/global/global.31.wasm differ diff --git a/extended-const/global/global.32.wasm b/extended-const/global/global.32.wasm new file mode 100644 index 00000000..3bcbca49 Binary files /dev/null and b/extended-const/global/global.32.wasm differ diff --git a/extended-const/global/global.33.wasm b/extended-const/global/global.33.wasm new file mode 100644 index 00000000..996f3b1e Binary files /dev/null and b/extended-const/global/global.33.wasm differ diff --git a/extended-const/global/global.34.wasm b/extended-const/global/global.34.wasm new file mode 100644 index 00000000..dde8474b Binary files /dev/null and b/extended-const/global/global.34.wasm differ diff --git a/extended-const/global/global.35.wasm b/extended-const/global/global.35.wasm new file mode 100644 index 00000000..6eb4a99b Binary files /dev/null and b/extended-const/global/global.35.wasm differ diff --git a/extended-const/global/global.36.wasm b/extended-const/global/global.36.wasm new file mode 100644 index 00000000..ae6821b2 Binary files /dev/null and b/extended-const/global/global.36.wasm differ diff --git a/extended-const/global/global.37.wasm b/extended-const/global/global.37.wasm new file mode 100644 index 00000000..9596b6f6 Binary files /dev/null and b/extended-const/global/global.37.wasm differ diff --git a/extended-const/global/global.38.wasm b/extended-const/global/global.38.wasm new file mode 100644 index 00000000..812b82c1 Binary files /dev/null and b/extended-const/global/global.38.wasm differ diff --git a/extended-const/global/global.39.wasm b/extended-const/global/global.39.wasm new file mode 100644 index 00000000..f1f2afdf Binary files /dev/null and b/extended-const/global/global.39.wasm differ diff --git a/extended-const/global/global.4.wasm b/extended-const/global/global.4.wasm new file mode 100644 index 00000000..638420f5 Binary files /dev/null and b/extended-const/global/global.4.wasm differ diff --git a/extended-const/global/global.40.wasm b/extended-const/global/global.40.wasm new file mode 100644 index 00000000..2be59896 Binary files /dev/null and b/extended-const/global/global.40.wasm differ diff --git a/extended-const/global/global.41.wasm b/extended-const/global/global.41.wasm new file mode 100644 index 00000000..3b5313be Binary files /dev/null and b/extended-const/global/global.41.wasm differ diff --git a/extended-const/global/global.42.wasm b/extended-const/global/global.42.wasm new file mode 100644 index 00000000..57031c88 Binary files /dev/null and b/extended-const/global/global.42.wasm differ diff --git a/extended-const/global/global.43.wasm b/extended-const/global/global.43.wasm new file mode 100644 index 00000000..d61c8812 Binary files /dev/null and b/extended-const/global/global.43.wasm differ diff --git a/extended-const/global/global.44.wasm b/extended-const/global/global.44.wasm new file mode 100644 index 00000000..c466c9fa Binary files /dev/null and b/extended-const/global/global.44.wasm differ diff --git a/extended-const/global/global.45.wasm b/extended-const/global/global.45.wasm new file mode 100644 index 00000000..908519ff Binary files /dev/null and b/extended-const/global/global.45.wasm differ diff --git a/extended-const/global/global.46.wasm b/extended-const/global/global.46.wasm new file mode 100644 index 00000000..b9c97f0f Binary files /dev/null and b/extended-const/global/global.46.wasm differ diff --git a/extended-const/global/global.47.wasm b/extended-const/global/global.47.wasm new file mode 100644 index 00000000..550efbe2 Binary files /dev/null and b/extended-const/global/global.47.wasm differ diff --git a/extended-const/global/global.48.wasm b/extended-const/global/global.48.wasm new file mode 100644 index 00000000..20e3ab45 Binary files /dev/null and b/extended-const/global/global.48.wasm differ diff --git a/extended-const/global/global.49.wat b/extended-const/global/global.49.wat new file mode 100644 index 00000000..f0be4a59 --- /dev/null +++ b/extended-const/global/global.49.wat @@ -0,0 +1 @@ +(global $foo i32 (i32.const 0))(global $foo i32 (i32.const 0)) \ No newline at end of file diff --git a/extended-const/global/global.5.wasm b/extended-const/global/global.5.wasm new file mode 100644 index 00000000..e1371f42 Binary files /dev/null and b/extended-const/global/global.5.wasm differ diff --git a/extended-const/global/global.50.wat b/extended-const/global/global.50.wat new file mode 100644 index 00000000..7a706870 --- /dev/null +++ b/extended-const/global/global.50.wat @@ -0,0 +1 @@ +(import "" "" (global $foo i32))(global $foo i32 (i32.const 0)) \ No newline at end of file diff --git a/extended-const/global/global.51.wat b/extended-const/global/global.51.wat new file mode 100644 index 00000000..7c7a305e --- /dev/null +++ b/extended-const/global/global.51.wat @@ -0,0 +1 @@ +(import "" "" (global $foo i32))(import "" "" (global $foo i32)) \ No newline at end of file diff --git a/extended-const/global/global.6.wasm b/extended-const/global/global.6.wasm new file mode 100644 index 00000000..64952167 Binary files /dev/null and b/extended-const/global/global.6.wasm differ diff --git a/extended-const/global/global.7.wasm b/extended-const/global/global.7.wasm new file mode 100644 index 00000000..c56bd297 Binary files /dev/null and b/extended-const/global/global.7.wasm differ diff --git a/extended-const/global/global.8.wasm b/extended-const/global/global.8.wasm new file mode 100644 index 00000000..b94d1e44 Binary files /dev/null and b/extended-const/global/global.8.wasm differ diff --git a/extended-const/global/global.9.wasm b/extended-const/global/global.9.wasm new file mode 100644 index 00000000..a5d518ec Binary files /dev/null and b/extended-const/global/global.9.wasm differ diff --git a/extended-const/global/global.json b/extended-const/global/global.json new file mode 100644 index 00000000..24a341d2 --- /dev/null +++ b/extended-const/global/global.json @@ -0,0 +1,116 @@ +{"source_filename": "global.wast", + "commands": [ + {"type": "module", "line": 3, "filename": "global.0.wasm"}, + {"type": "assert_return", "line": 204, "action": {"type": "invoke", "field": "get-a", "args": []}, "expected": [{"type": "i32", "value": "4294967294"}]}, + {"type": "assert_return", "line": 205, "action": {"type": "invoke", "field": "get-b", "args": []}, "expected": [{"type": "i64", "value": "18446744073709551611"}]}, + {"type": "assert_return", "line": 206, "action": {"type": "invoke", "field": "get-r", "args": []}, "expected": [{"type": "externref", "value": "null"}]}, + {"type": "assert_return", "line": 207, "action": {"type": "invoke", "field": "get-mr", "args": []}, "expected": [{"type": "externref", "value": "null"}]}, + {"type": "assert_return", "line": 208, "action": {"type": "invoke", "field": "get-x", "args": []}, "expected": [{"type": "i32", "value": "4294967284"}]}, + {"type": "assert_return", "line": 209, "action": {"type": "invoke", "field": "get-y", "args": []}, "expected": [{"type": "i64", "value": "18446744073709551601"}]}, + {"type": "assert_return", "line": 210, "action": {"type": "invoke", "field": "get-z1", "args": []}, "expected": [{"type": "i32", "value": "666"}]}, + {"type": "assert_return", "line": 211, "action": {"type": "invoke", "field": "get-z2", "args": []}, "expected": [{"type": "i64", "value": "666"}]}, + {"type": "assert_return", "line": 212, "action": {"type": "invoke", "field": "get-z3", "args": []}, "expected": [{"type": "i32", "value": "42"}]}, + {"type": "assert_return", "line": 213, "action": {"type": "invoke", "field": "get-z4", "args": []}, "expected": [{"type": "i64", "value": "43"}]}, + {"type": "assert_return", "line": 214, "action": {"type": "invoke", "field": "get-z5", "args": []}, "expected": [{"type": "i32", "value": "708"}]}, + {"type": "assert_return", "line": 215, "action": {"type": "invoke", "field": "get-z6", "args": []}, "expected": [{"type": "i64", "value": "708"}]}, + {"type": "assert_return", "line": 217, "action": {"type": "invoke", "field": "get-3", "args": []}, "expected": [{"type": "f32", "value": "3225419776"}]}, + {"type": "assert_return", "line": 218, "action": {"type": "invoke", "field": "get-4", "args": []}, "expected": [{"type": "f64", "value": "13839561654909534208"}]}, + {"type": "assert_return", "line": 219, "action": {"type": "invoke", "field": "get-7", "args": []}, "expected": [{"type": "f32", "value": "3243245568"}]}, + {"type": "assert_return", "line": 220, "action": {"type": "invoke", "field": "get-8", "args": []}, "expected": [{"type": "f64", "value": "13847442954257432576"}]}, + {"type": "assert_return", "line": 222, "action": {"type": "invoke", "field": "set-x", "args": [{"type": "i32", "value": "6"}]}, "expected": []}, + {"type": "assert_return", "line": 223, "action": {"type": "invoke", "field": "set-y", "args": [{"type": "i64", "value": "7"}]}, "expected": []}, + {"type": "assert_return", "line": 225, "action": {"type": "invoke", "field": "set-7", "args": [{"type": "f32", "value": "1090519040"}]}, "expected": []}, + {"type": "assert_return", "line": 226, "action": {"type": "invoke", "field": "set-8", "args": [{"type": "f64", "value": "4621256167635550208"}]}, "expected": []}, + {"type": "assert_return", "line": 228, "action": {"type": "invoke", "field": "get-x", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 229, "action": {"type": "invoke", "field": "get-y", "args": []}, "expected": [{"type": "i64", "value": "7"}]}, + {"type": "assert_return", "line": 230, "action": {"type": "invoke", "field": "get-7", "args": []}, "expected": [{"type": "f32", "value": "1090519040"}]}, + {"type": "assert_return", "line": 231, "action": {"type": "invoke", "field": "get-8", "args": []}, "expected": [{"type": "f64", "value": "4621256167635550208"}]}, + {"type": "assert_return", "line": 233, "action": {"type": "invoke", "field": "set-7", "args": [{"type": "f32", "value": "1090519040"}]}, "expected": []}, + {"type": "assert_return", "line": 234, "action": {"type": "invoke", "field": "set-8", "args": [{"type": "f64", "value": "4621256167635550208"}]}, "expected": []}, + {"type": "assert_return", "line": 235, "action": {"type": "invoke", "field": "set-mr", "args": [{"type": "externref", "value": "10"}]}, "expected": []}, + {"type": "assert_return", "line": 237, "action": {"type": "invoke", "field": "get-x", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 238, "action": {"type": "invoke", "field": "get-y", "args": []}, "expected": [{"type": "i64", "value": "7"}]}, + {"type": "assert_return", "line": 239, "action": {"type": "invoke", "field": "get-7", "args": []}, "expected": [{"type": "f32", "value": "1090519040"}]}, + {"type": "assert_return", "line": 240, "action": {"type": "invoke", "field": "get-8", "args": []}, "expected": [{"type": "f64", "value": "4621256167635550208"}]}, + {"type": "assert_return", "line": 241, "action": {"type": "invoke", "field": "get-mr", "args": []}, "expected": [{"type": "externref", "value": "10"}]}, + {"type": "assert_return", "line": 243, "action": {"type": "invoke", "field": "as-select-first", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 244, "action": {"type": "invoke", "field": "as-select-mid", "args": []}, "expected": [{"type": "i32", "value": "2"}]}, + {"type": "assert_return", "line": 245, "action": {"type": "invoke", "field": "as-select-last", "args": []}, "expected": [{"type": "i32", "value": "2"}]}, + {"type": "assert_return", "line": 247, "action": {"type": "invoke", "field": "as-loop-first", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 248, "action": {"type": "invoke", "field": "as-loop-mid", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 249, "action": {"type": "invoke", "field": "as-loop-last", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 251, "action": {"type": "invoke", "field": "as-if-condition", "args": []}, "expected": [{"type": "i32", "value": "2"}]}, + {"type": "assert_return", "line": 252, "action": {"type": "invoke", "field": "as-if-then", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 253, "action": {"type": "invoke", "field": "as-if-else", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 255, "action": {"type": "invoke", "field": "as-br_if-first", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 256, "action": {"type": "invoke", "field": "as-br_if-last", "args": []}, "expected": [{"type": "i32", "value": "2"}]}, + {"type": "assert_return", "line": 258, "action": {"type": "invoke", "field": "as-br_table-first", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 259, "action": {"type": "invoke", "field": "as-br_table-last", "args": []}, "expected": [{"type": "i32", "value": "2"}]}, + {"type": "assert_return", "line": 261, "action": {"type": "invoke", "field": "as-call_indirect-first", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 262, "action": {"type": "invoke", "field": "as-call_indirect-mid", "args": []}, "expected": [{"type": "i32", "value": "2"}]}, + {"type": "assert_trap", "line": 263, "action": {"type": "invoke", "field": "as-call_indirect-last", "args": []}, "text": "undefined element", "expected": [{"type": "i32"}]}, + {"type": "assert_return", "line": 265, "action": {"type": "invoke", "field": "as-store-first", "args": []}, "expected": []}, + {"type": "assert_return", "line": 266, "action": {"type": "invoke", "field": "as-store-last", "args": []}, "expected": []}, + {"type": "assert_return", "line": 267, "action": {"type": "invoke", "field": "as-load-operand", "args": []}, "expected": [{"type": "i32", "value": "1"}]}, + {"type": "assert_return", "line": 268, "action": {"type": "invoke", "field": "as-memory.grow-value", "args": []}, "expected": [{"type": "i32", "value": "1"}]}, + {"type": "assert_return", "line": 270, "action": {"type": "invoke", "field": "as-call-value", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 272, "action": {"type": "invoke", "field": "as-return-value", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 273, "action": {"type": "invoke", "field": "as-drop-operand", "args": []}, "expected": []}, + {"type": "assert_return", "line": 274, "action": {"type": "invoke", "field": "as-br-value", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 276, "action": {"type": "invoke", "field": "as-local.set-value", "args": [{"type": "i32", "value": "1"}]}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 277, "action": {"type": "invoke", "field": "as-local.tee-value", "args": [{"type": "i32", "value": "1"}]}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 278, "action": {"type": "invoke", "field": "as-global.set-value", "args": []}, "expected": [{"type": "i32", "value": "6"}]}, + {"type": "assert_return", "line": 280, "action": {"type": "invoke", "field": "as-unary-operand", "args": []}, "expected": [{"type": "i32", "value": "0"}]}, + {"type": "assert_return", "line": 281, "action": {"type": "invoke", "field": "as-binary-operand", "args": []}, "expected": [{"type": "i32", "value": "36"}]}, + {"type": "assert_return", "line": 282, "action": {"type": "invoke", "field": "as-compare-operand", "args": []}, "expected": [{"type": "i32", "value": "1"}]}, + {"type": "assert_invalid", "line": 285, "filename": "global.1.wasm", "text": "global is immutable", "module_type": "binary"}, + {"type": "assert_invalid", "line": 290, "filename": "global.2.wasm", "text": "global is immutable", "module_type": "binary"}, + {"type": "module", "line": 295, "filename": "global.3.wasm"}, + {"type": "module", "line": 296, "filename": "global.4.wasm"}, + {"type": "assert_invalid", "line": 299, "filename": "global.5.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 304, "filename": "global.6.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 309, "filename": "global.7.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 314, "filename": "global.8.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 319, "filename": "global.9.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 324, "filename": "global.10.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "assert_invalid", "line": 329, "filename": "global.11.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 334, "filename": "global.12.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 339, "filename": "global.13.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 344, "filename": "global.14.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 349, "filename": "global.15.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 354, "filename": "global.16.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 359, "filename": "global.17.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 364, "filename": "global.18.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 368, "filename": "global.19.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 373, "filename": "global.20.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 378, "filename": "global.21.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 383, "filename": "global.22.wasm", "text": "constant expression required", "module_type": "binary"}, + {"type": "module", "line": 387, "filename": "global.23.wasm"}, + {"type": "assert_malformed", "line": 391, "filename": "global.24.wasm", "text": "malformed mutability", "module_type": "binary"}, + {"type": "assert_malformed", "line": 404, "filename": "global.25.wasm", "text": "malformed mutability", "module_type": "binary"}, + {"type": "module", "line": 417, "filename": "global.26.wasm"}, + {"type": "assert_malformed", "line": 421, "filename": "global.27.wasm", "text": "malformed mutability", "module_type": "binary"}, + {"type": "assert_malformed", "line": 433, "filename": "global.28.wasm", "text": "malformed mutability", "module_type": "binary"}, + {"type": "assert_invalid", "line": 447, "filename": "global.29.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 452, "filename": "global.30.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 460, "filename": "global.31.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 468, "filename": "global.32.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 478, "filename": "global.33.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 483, "filename": "global.34.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 491, "filename": "global.35.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 499, "filename": "global.36.wasm", "text": "unknown global", "module_type": "binary"}, + {"type": "assert_invalid", "line": 509, "filename": "global.37.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 518, "filename": "global.38.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 528, "filename": "global.39.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 538, "filename": "global.40.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 548, "filename": "global.41.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 558, "filename": "global.42.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 568, "filename": "global.43.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 578, "filename": "global.44.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 588, "filename": "global.45.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 597, "filename": "global.46.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 606, "filename": "global.47.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_invalid", "line": 616, "filename": "global.48.wasm", "text": "type mismatch", "module_type": "binary"}, + {"type": "assert_malformed", "line": 634, "filename": "global.49.wat", "text": "duplicate global", "module_type": "text"}, + {"type": "assert_malformed", "line": 638, "filename": "global.50.wat", "text": "duplicate global", "module_type": "text"}, + {"type": "assert_malformed", "line": 642, "filename": "global.51.wat", "text": "duplicate global", "module_type": "text"}]} diff --git a/extended-const/global/global.wast b/extended-const/global/global.wast new file mode 100644 index 00000000..d5369dcd --- /dev/null +++ b/extended-const/global/global.wast @@ -0,0 +1,645 @@ +;; Test globals + +(module + (global (import "spectest" "global_i32") i32) + (global (import "spectest" "global_i64") i64) + + (global $a i32 (i32.const -2)) + (global (;3;) f32 (f32.const -3)) + (global (;4;) f64 (f64.const -4)) + (global $b i64 (i64.const -5)) + + (global $x (mut i32) (i32.const -12)) + (global (;7;) (mut f32) (f32.const -13)) + (global (;8;) (mut f64) (f64.const -14)) + (global $y (mut i64) (i64.const -15)) + + (global $z1 i32 (global.get 0)) + (global $z2 i64 (global.get 1)) + (global $z3 i32 (i32.add (i32.sub (i32.mul (i32.const 20) (i32.const 2)) (i32.const 2)) (i32.const 4))) + (global $z4 i64 (i64.add (i64.sub (i64.mul (i64.const 20) (i64.const 2)) (i64.const 2)) (i64.const 5))) + (global $z5 i32 (i32.add (global.get 0) (i32.const 42))) + (global $z6 i64 (i64.add (global.get 1) (i64.const 42))) + + (global $r externref (ref.null extern)) + (global $mr (mut externref) (ref.null extern)) + (global funcref (ref.null func)) + + (func (export "get-a") (result i32) (global.get $a)) + (func (export "get-b") (result i64) (global.get $b)) + (func (export "get-r") (result externref) (global.get $r)) + (func (export "get-mr") (result externref) (global.get $mr)) + (func (export "get-x") (result i32) (global.get $x)) + (func (export "get-y") (result i64) (global.get $y)) + (func (export "get-z1") (result i32) (global.get $z1)) + (func (export "get-z2") (result i64) (global.get $z2)) + (func (export "get-z3") (result i32) (global.get $z3)) + (func (export "get-z4") (result i64) (global.get $z4)) + (func (export "get-z5") (result i32) (global.get $z5)) + (func (export "get-z6") (result i64) (global.get $z6)) + (func (export "set-x") (param i32) (global.set $x (local.get 0))) + (func (export "set-y") (param i64) (global.set $y (local.get 0))) + (func (export "set-mr") (param externref) (global.set $mr (local.get 0))) + + (func (export "get-3") (result f32) (global.get 3)) + (func (export "get-4") (result f64) (global.get 4)) + (func (export "get-7") (result f32) (global.get 7)) + (func (export "get-8") (result f64) (global.get 8)) + (func (export "set-7") (param f32) (global.set 7 (local.get 0))) + (func (export "set-8") (param f64) (global.set 8 (local.get 0))) + + ;; As the argument of control constructs and instructions + + (memory 1) + + (func $dummy) + + (func (export "as-select-first") (result i32) + (select (global.get $x) (i32.const 2) (i32.const 3)) + ) + (func (export "as-select-mid") (result i32) + (select (i32.const 2) (global.get $x) (i32.const 3)) + ) + (func (export "as-select-last") (result i32) + (select (i32.const 2) (i32.const 3) (global.get $x)) + ) + + (func (export "as-loop-first") (result i32) + (loop (result i32) + (global.get $x) (call $dummy) (call $dummy) + ) + ) + (func (export "as-loop-mid") (result i32) + (loop (result i32) + (call $dummy) (global.get $x) (call $dummy) + ) + ) + (func (export "as-loop-last") (result i32) + (loop (result i32) + (call $dummy) (call $dummy) (global.get $x) + ) + ) + + (func (export "as-if-condition") (result i32) + (if (result i32) (global.get $x) + (then (call $dummy) (i32.const 2)) + (else (call $dummy) (i32.const 3)) + ) + ) + (func (export "as-if-then") (result i32) + (if (result i32) (i32.const 1) + (then (global.get $x)) (else (i32.const 2)) + ) + ) + (func (export "as-if-else") (result i32) + (if (result i32) (i32.const 0) + (then (i32.const 2)) (else (global.get $x)) + ) + ) + + (func (export "as-br_if-first") (result i32) + (block (result i32) + (br_if 0 (global.get $x) (i32.const 2)) + (return (i32.const 3)) + ) + ) + (func (export "as-br_if-last") (result i32) + (block (result i32) + (br_if 0 (i32.const 2) (global.get $x)) + (return (i32.const 3)) + ) + ) + + (func (export "as-br_table-first") (result i32) + (block (result i32) + (global.get $x) (i32.const 2) (br_table 0 0) + ) + ) + (func (export "as-br_table-last") (result i32) + (block (result i32) + (i32.const 2) (global.get $x) (br_table 0 0) + ) + ) + + (func $func (param i32 i32) (result i32) (local.get 0)) + (type $check (func (param i32 i32) (result i32))) + (table funcref (elem $func)) + (func (export "as-call_indirect-first") (result i32) + (block (result i32) + (call_indirect (type $check) + (global.get $x) (i32.const 2) (i32.const 0) + ) + ) + ) + (func (export "as-call_indirect-mid") (result i32) + (block (result i32) + (call_indirect (type $check) + (i32.const 2) (global.get $x) (i32.const 0) + ) + ) + ) + (func (export "as-call_indirect-last") (result i32) + (block (result i32) + (call_indirect (type $check) + (i32.const 2) (i32.const 0) (global.get $x) + ) + ) + ) + + (func (export "as-store-first") + (global.get $x) (i32.const 1) (i32.store) + ) + (func (export "as-store-last") + (i32.const 0) (global.get $x) (i32.store) + ) + (func (export "as-load-operand") (result i32) + (i32.load (global.get $x)) + ) + (func (export "as-memory.grow-value") (result i32) + (memory.grow (global.get $x)) + ) + + (func $f (param i32) (result i32) (local.get 0)) + (func (export "as-call-value") (result i32) + (call $f (global.get $x)) + ) + + (func (export "as-return-value") (result i32) + (global.get $x) (return) + ) + (func (export "as-drop-operand") + (drop (global.get $x)) + ) + (func (export "as-br-value") (result i32) + (block (result i32) (br 0 (global.get $x))) + ) + + (func (export "as-local.set-value") (param i32) (result i32) + (local.set 0 (global.get $x)) + (local.get 0) + ) + (func (export "as-local.tee-value") (param i32) (result i32) + (local.tee 0 (global.get $x)) + ) + (func (export "as-global.set-value") (result i32) + (global.set $x (global.get $x)) + (global.get $x) + ) + + (func (export "as-unary-operand") (result i32) + (i32.eqz (global.get $x)) + ) + (func (export "as-binary-operand") (result i32) + (i32.mul + (global.get $x) (global.get $x) + ) + ) + (func (export "as-compare-operand") (result i32) + (i32.gt_u + (global.get 0) (i32.const 1) + ) + ) +) + +(assert_return (invoke "get-a") (i32.const -2)) +(assert_return (invoke "get-b") (i64.const -5)) +(assert_return (invoke "get-r") (ref.null extern)) +(assert_return (invoke "get-mr") (ref.null extern)) +(assert_return (invoke "get-x") (i32.const -12)) +(assert_return (invoke "get-y") (i64.const -15)) +(assert_return (invoke "get-z1") (i32.const 666)) +(assert_return (invoke "get-z2") (i64.const 666)) +(assert_return (invoke "get-z3") (i32.const 42)) +(assert_return (invoke "get-z4") (i64.const 43)) +(assert_return (invoke "get-z5") (i32.const 708)) +(assert_return (invoke "get-z6") (i64.const 708)) + +(assert_return (invoke "get-3") (f32.const -3)) +(assert_return (invoke "get-4") (f64.const -4)) +(assert_return (invoke "get-7") (f32.const -13)) +(assert_return (invoke "get-8") (f64.const -14)) + +(assert_return (invoke "set-x" (i32.const 6))) +(assert_return (invoke "set-y" (i64.const 7))) + +(assert_return (invoke "set-7" (f32.const 8))) +(assert_return (invoke "set-8" (f64.const 9))) + +(assert_return (invoke "get-x") (i32.const 6)) +(assert_return (invoke "get-y") (i64.const 7)) +(assert_return (invoke "get-7") (f32.const 8)) +(assert_return (invoke "get-8") (f64.const 9)) + +(assert_return (invoke "set-7" (f32.const 8))) +(assert_return (invoke "set-8" (f64.const 9))) +(assert_return (invoke "set-mr" (ref.extern 10))) + +(assert_return (invoke "get-x") (i32.const 6)) +(assert_return (invoke "get-y") (i64.const 7)) +(assert_return (invoke "get-7") (f32.const 8)) +(assert_return (invoke "get-8") (f64.const 9)) +(assert_return (invoke "get-mr") (ref.extern 10)) + +(assert_return (invoke "as-select-first") (i32.const 6)) +(assert_return (invoke "as-select-mid") (i32.const 2)) +(assert_return (invoke "as-select-last") (i32.const 2)) + +(assert_return (invoke "as-loop-first") (i32.const 6)) +(assert_return (invoke "as-loop-mid") (i32.const 6)) +(assert_return (invoke "as-loop-last") (i32.const 6)) + +(assert_return (invoke "as-if-condition") (i32.const 2)) +(assert_return (invoke "as-if-then") (i32.const 6)) +(assert_return (invoke "as-if-else") (i32.const 6)) + +(assert_return (invoke "as-br_if-first") (i32.const 6)) +(assert_return (invoke "as-br_if-last") (i32.const 2)) + +(assert_return (invoke "as-br_table-first") (i32.const 6)) +(assert_return (invoke "as-br_table-last") (i32.const 2)) + +(assert_return (invoke "as-call_indirect-first") (i32.const 6)) +(assert_return (invoke "as-call_indirect-mid") (i32.const 2)) +(assert_trap (invoke "as-call_indirect-last") "undefined element") + +(assert_return (invoke "as-store-first")) +(assert_return (invoke "as-store-last")) +(assert_return (invoke "as-load-operand") (i32.const 1)) +(assert_return (invoke "as-memory.grow-value") (i32.const 1)) + +(assert_return (invoke "as-call-value") (i32.const 6)) + +(assert_return (invoke "as-return-value") (i32.const 6)) +(assert_return (invoke "as-drop-operand")) +(assert_return (invoke "as-br-value") (i32.const 6)) + +(assert_return (invoke "as-local.set-value" (i32.const 1)) (i32.const 6)) +(assert_return (invoke "as-local.tee-value" (i32.const 1)) (i32.const 6)) +(assert_return (invoke "as-global.set-value") (i32.const 6)) + +(assert_return (invoke "as-unary-operand") (i32.const 0)) +(assert_return (invoke "as-binary-operand") (i32.const 36)) +(assert_return (invoke "as-compare-operand") (i32.const 1)) + +(assert_invalid + (module (global f32 (f32.const 0)) (func (global.set 0 (f32.const 1)))) + "global is immutable" +) + +(assert_invalid + (module (import "spectest" "global_i32" (global i32)) (func (global.set 0 (i32.const 1)))) + "global is immutable" +) + +;; mutable globals can be exported +(module (global (mut f32) (f32.const 0)) (export "a" (global 0))) +(module (global (export "a") (mut f32) (f32.const 0))) + +(assert_invalid + (module (global f32 (f32.neg (f32.const 0)))) + "constant expression required" +) + +(assert_invalid + (module (global f32 (local.get 0))) + "constant expression required" +) + +(assert_invalid + (module (global f32 (f32.neg (f32.const 1)))) + "constant expression required" +) + +(assert_invalid + (module (global i32 (i32.const 0) (nop))) + "constant expression required" +) + +(assert_invalid + (module (global i32 (i32.ctz (i32.const 0)))) + "constant expression required" +) + +(assert_invalid + (module (global i32 (nop))) + "constant expression required" +) + +(assert_invalid + (module (global i32 (f32.const 0))) + "type mismatch" +) + +(assert_invalid + (module (global i32 (i32.const 0) (i32.const 0))) + "type mismatch" +) + +(assert_invalid + (module (global i32 (;empty instruction sequence;))) + "type mismatch" +) + +(assert_invalid + (module (global (import "" "") externref) (global funcref (global.get 0))) + "type mismatch" +) + +(assert_invalid + (module (global (import "test" "global-i32") i32) (global i32 (global.get 0) (global.get 0))) + "type mismatch" +) + +(assert_invalid + (module (global (import "test" "global-i32") i32) (global i32 (i32.const 0) (global.get 0))) + "type mismatch" +) + +(assert_invalid + (module (global i32 (global.get 0))) + "unknown global" +) + +(assert_invalid + (module (global i32 (i32.const 0)) (global i32 (global.get 0))) + "unknown global" +) +(assert_invalid + (module (global $g i32 (i32.const 0)) (global i32 (global.get $g))) + "unknown global" +) + +(assert_invalid + (module (global i32 (global.get 1)) (global i32 (i32.const 0))) + "unknown global" +) + +(assert_invalid + (module (global (import "test" "global-i32") i32) (global i32 (global.get 2))) + "unknown global" +) + +(assert_invalid + (module (global (import "test" "global-mut-i32") (mut i32)) (global i32 (global.get 0))) + "constant expression required" +) + +(module + (import "spectest" "global_i32" (global i32)) +) +(assert_malformed + (module binary + "\00asm" "\01\00\00\00" + "\02\98\80\80\80\00" ;; import section + "\01" ;; length 1 + "\08\73\70\65\63\74\65\73\74" ;; "spectest" + "\0a\67\6c\6f\62\61\6c\5f\69\33\32" ;; "global_i32" + "\03" ;; GlobalImport + "\7f" ;; i32 + "\02" ;; malformed mutability + ) + "malformed mutability" +) +(assert_malformed + (module binary + "\00asm" "\01\00\00\00" + "\02\98\80\80\80\00" ;; import section + "\01" ;; length 1 + "\08\73\70\65\63\74\65\73\74" ;; "spectest" + "\0a\67\6c\6f\62\61\6c\5f\69\33\32" ;; "global_i32" + "\03" ;; GlobalImport + "\7f" ;; i32 + "\ff" ;; malformed mutability + ) + "malformed mutability" +) + +(module + (global i32 (i32.const 0)) +) +(assert_malformed + (module binary + "\00asm" "\01\00\00\00" + "\06\86\80\80\80\00" ;; global section + "\01" ;; length 1 + "\7f" ;; i32 + "\02" ;; malformed mutability + "\41\00" ;; i32.const 0 + "\0b" ;; end + ) + "malformed mutability" +) +(assert_malformed + (module binary + "\00asm" "\01\00\00\00" + "\06\86\80\80\80\00" ;; global section + "\01" ;; length 1 + "\7f" ;; i32 + "\ff" ;; malformed mutability + "\41\00" ;; i32.const 0 + "\0b" ;; end + ) + "malformed mutability" +) + +;; global.get with invalid index +(assert_invalid + (module (func (result i32) (global.get 0))) + "unknown global" +) + +(assert_invalid + (module + (global i32 (i32.const 0)) + (func (result i32) (global.get 1)) + ) + "unknown global" +) + +(assert_invalid + (module + (import "spectest" "global_i32" (global i32)) + (func (result i32) (global.get 1)) + ) + "unknown global" +) + +(assert_invalid + (module + (import "spectest" "global_i32" (global i32)) + (global i32 (i32.const 0)) + (func (result i32) (global.get 2)) + ) + "unknown global" +) + +;; global.set with invalid index +(assert_invalid + (module (func (i32.const 0) (global.set 0))) + "unknown global" +) + +(assert_invalid + (module + (global i32 (i32.const 0)) + (func (i32.const 0) (global.set 1)) + ) + "unknown global" +) + +(assert_invalid + (module + (import "spectest" "global_i32" (global i32)) + (func (i32.const 0) (global.set 1)) + ) + "unknown global" +) + +(assert_invalid + (module + (import "spectest" "global_i32" (global i32)) + (global i32 (i32.const 0)) + (func (i32.const 0) (global.set 2)) + ) + "unknown global" +) + + +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty + (global.set $x) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-block + (i32.const 0) + (block (global.set $x)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-loop + (i32.const 0) + (loop (global.set $x)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-then + (i32.const 0) (i32.const 0) + (if (then (global.set $x))) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-else + (i32.const 0) (i32.const 0) + (if (result i32) (then (i32.const 0)) (else (global.set $x))) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-br + (i32.const 0) + (block (br 0 (global.set $x))) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-br_if + (i32.const 0) + (block (br_if 0 (global.set $x))) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-br_table + (i32.const 0) + (block (br_table 0 (global.set $x))) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-return + (return (global.set $x)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-select + (select (global.set $x) (i32.const 1) (i32.const 2)) + ) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $type-global.set-value-empty-in-call + (call 1 (global.set $x)) + ) + (func (param i32) (result i32) (local.get 0)) + ) + "type mismatch" +) +(assert_invalid + (module + (global $x (mut i32) (i32.const 0)) + (func $f (param i32) (result i32) (local.get 0)) + (type $sig (func (param i32) (result i32))) + (table funcref (elem $f)) + (func $type-global.set-value-empty-in-call_indirect + (block (result i32) + (call_indirect (type $sig) + (global.set $x) (i32.const 0) + ) + ) + ) + ) + "type mismatch" +) + +;; Duplicate identifier errors + +(assert_malformed (module quote + "(global $foo i32 (i32.const 0))" + "(global $foo i32 (i32.const 0))") + "duplicate global") +(assert_malformed (module quote + "(import \"\" \"\" (global $foo i32))" + "(global $foo i32 (i32.const 0))") + "duplicate global") +(assert_malformed (module quote + "(import \"\" \"\" (global $foo i32))" + "(import \"\" \"\" (global $foo i32))") + "duplicate global")