summaryrefslogtreecommitdiff
path: root/test/lit/validation/closed-world-interface.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit/validation/closed-world-interface.wast')
-rw-r--r--test/lit/validation/closed-world-interface.wast78
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))
+)