;; Shared struct declaration syntax (module (type (shared (struct))) (type (sub final (shared (struct)))) (rec (type (sub final (shared (struct)))) ) (global (ref 0) (struct.new 1)) (global (ref 1) (struct.new 2)) (global (ref 2) (struct.new 0)) ) ;; Shared structs are distinct from non-shared structs (assert_invalid (module (type (shared (struct))) (type (struct)) (global (ref 0) (struct.new 1)) ) "not a subtype" ) (assert_invalid (module (type (shared (struct))) (type (struct)) (global (ref 1) (struct.new 0)) ) "not a subtype" ) ;; Shared structs may not be subtypes of non-shared structs (assert_invalid (module (type (sub (struct))) (type (sub 0 (shared (struct)))) ) "invalid supertype" ) ;; Non-shared structs may not be subtypes of shared structs (assert_invalid (module (type (sub (shared (struct)))) (type (sub 0 (struct))) ) "invalid supertype" ) ;; Shared structs may not contain non-shared references (assert_invalid (module (type (shared (struct anyref))) ) "invalid field" ) ;; But they may contain shared references (module (type (shared (struct (ref null (shared any))))) ) ;; Non-shared structs may contain shared references (module (type (struct (ref null (shared any)))) ) ;; Struct instructions work on shared structs. (module (type $i8 (shared (struct (mut i8)))) (type $i32 (shared (struct (mut i32)))) (type $unshared (struct (mut i8))) (func (struct.new $i8 (i32.const 0)) (drop)) (func (struct.new_default $i8) (drop)) (func (param (ref null $i8)) (struct.get_s $i8 0 (local.get 0)) (drop)) (func (param (ref null $i8)) (struct.get_u $i8 0 (local.get 0)) (drop)) (func (param (ref null $i32)) (struct.get $i32 0 (local.get 0)) (drop)) (func (param (ref null $i8)) (struct.set $i8 0 (local.get 0) (i32.const 0))) ) ;; Bottom types (module (type $i8 (shared (struct (mut i8)))) (func (drop (struct.get_s $i8 0 (ref.null (shared none))))) (func (drop (struct.get_u $i8 0 (ref.null (shared none))))) (func (struct.set $i8 0 (ref.null (shared none)) (i32.const 0))) )