diff options
Diffstat (limited to 'test/lit/validation')
-rw-r--r-- | test/lit/validation/closed-world-interface.wast | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/test/lit/validation/closed-world-interface.wast b/test/lit/validation/closed-world-interface.wast new file mode 100644 index 000000000..f6f663550 --- /dev/null +++ b/test/lit/validation/closed-world-interface.wast @@ -0,0 +1,78 @@ +;; Test that we error out on nontrivial public types with --closed-world + +;; RUN: not wasm-opt -all --closed-world %s 2>&1 | filecheck %s + + +;; This is pulled in because it is part of a rec group with $partial-pair-0. +;; CHECK: publicly exposed type disallowed with a closed world: $partial-pair-1, on +;; CHECK-NEXT: (func) + +;; This is pulled in by a global. +;; CHECK: publicly exposed type disallowed with a closed world: $array, on +;; CHECK-NEXT: (array (mut i8)) + +;; This is pulled in only by a global, so it is disallowed even though it is a function type. +;; CHECK: publicly exposed type disallowed with a closed world: $private, on +;; CHECK-NEXT: (func (param v128)) + +;; This is referred to by the type of a function export, but is still not allowed. +;; CHECK: publicly exposed type disallowed with a closed world: $struct, on +;; CHECK-NEXT: (struct) + +(module + (type $struct (struct)) + (type $array (array (mut i8))) + + (type $void (func)) + (type $abstract (func (param anyref))) + (type $concrete (func (param (ref null $struct)))) + + (rec + (type $exported-pair-0 (func (param (ref $exported-pair-1)))) + (type $exported-pair-1 (func (param (ref $exported-pair-0)))) + ) + (rec + (type $partial-pair-0 (func)) + (type $partial-pair-1 (func)) + ) + + (type $private (func (param v128))) + + (func $1 (export "test1") (type $void) + (unreachable) + ) + + ;; Ok because it only refers to basic heap types + (func $2 (export "test2") (type $abstract) + (unreachable) + ) + + ;; Not ok because it refers to $struct. + (func $3 (export "test3") (type $concrete) + (unreachable) + ) + + ;; Ok even though it is in a rec group because the rest of the group and the + ;; types this refers to are on the boundary as well. + (func $4 (export "test4") (type $exported-pair-0) + (unreachable) + ) + + ;; Ok even though it is an import instead of an export. + (func $5 (import "env" "test5") (type $exported-pair-1)) + + ;; Not ok because another type in the group is not on the boundary. + (func $6 (export "test6") (type $partial-pair-0) + (unreachable) + ) + + ;; Not ok. + (global $1 (export "g1") (ref null $array) (ref.null none)) + + ;; Ok because this type is on the boundary anyway. + (global $2 (export "g2") (ref null $void) (ref.null func)) + + ;; Not ok even though it is a function type because it is not otherwise on the + ;; boundary. + (global $3 (export "g3") (ref null $private) (ref.null func)) +) |