| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| ) | |
| (func $struct.new_desc (param $desc (ref null (exact $pair.desc))) (result (ref (exact $pair))) | |
| (struct.new_desc $pair | |
| (i32.const 1) | |
| (i64.const 2) | |
| (local.get $desc) | |
| ) | |
| ) | |
| (func (export "check-new") (result i32) | |
| (local $pair (ref null $pair)) | |
| (local.set $pair (call $struct.new_desc (struct.new $pair.desc))) | |
| (i32.and | |
| (i32.eq (struct.get $pair 0 (local.get $pair)) (i32.const 1)) | |
| (i64.eq (struct.get $pair 1 (local.get $pair)) (i64.const 2)) | |
| ) | |
| ) | |
| (func (export "new-null-desc") | |
| (drop (call $struct.new_desc (ref.null none))) | |
| ) | |
| (func $struct.new_default_desc (param $desc (ref null (exact $pair.desc))) (result (ref (exact $pair))) | |
| (struct.new_default_desc $pair | |
| (local.get $desc) | |
| ) | |
| ) | |
| (func (export "check-new-default") (result i32) | |
| (local $pair (ref null $pair)) | |
| (local.set $pair (call $struct.new_default_desc (struct.new $pair.desc))) | |
| (i32.and | |
| (i32.eq (struct.get $pair 0 (local.get $pair)) (i32.const 0)) | |
| (i64.eq (struct.get $pair 1 (local.get $pair)) (i64.const 0)) | |
| ) | |
| ) | |
| (func (export "new-default-null-desc") | |
| (drop (call $struct.new_default_desc (ref.null none))) | |
| ) | |
| ) | |
| (assert_return (invoke "check-new") (i32.const 1)) | |
| (assert_return (invoke "check-new-default") (i32.const 1)) | |
| (assert_trap (invoke "new-null-desc") "null descriptor") | |
| (assert_trap (invoke "new-default-null-desc") "null descriptor") | |
| (assert_invalid | |
| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| ) | |
| (func (result (ref (exact $pair))) | |
| ;; The descriptor operand is missing. | |
| (struct.new_desc $pair | |
| (i32.const 0) | |
| (i64.const 1) | |
| ) | |
| ) | |
| ) | |
| "popping from empty stack" | |
| ) | |
| (assert_invalid | |
| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| ) | |
| (func (result (ref (exact $pair))) | |
| ;; The descriptor operand is missing. | |
| (struct.new_default_desc $pair) | |
| ) | |
| ) | |
| "popping from empty stack" | |
| ) | |
| (assert_invalid | |
| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| ) | |
| (func (result (ref (exact $pair))) | |
| ;; The descriptor needs to be exact. | |
| (local $desc (ref null $pair.desc)) | |
| (struct.new_desc $pair | |
| (i32.const 0) | |
| (i64.const 1) | |
| (local.get $desc) | |
| ) | |
| ) | |
| ) | |
| "struct.new descriptor operand should have proper type" | |
| ) | |
| (assert_invalid | |
| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| ) | |
| (func (result (ref (exact $pair))) | |
| ;; The descriptor needs to be exact. | |
| (local $desc (ref null $pair.desc)) | |
| (struct.new_default_desc $pair | |
| (local.get $desc) | |
| ) | |
| ) | |
| ) | |
| "struct.new descriptor operand should have proper type" | |
| ) | |
| (assert_invalid | |
| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| (type $other (struct)) | |
| ) | |
| (func (result (ref (exact $pair))) | |
| ;; The descriptor has the wrong heap type. | |
| (struct.new_desc $pair | |
| (i32.const 0) | |
| (i64.const 1) | |
| (struct.new $other) | |
| ) | |
| ) | |
| ) | |
| "struct.new descriptor operand should have proper type" | |
| ) | |
| (assert_invalid | |
| (module | |
| (rec | |
| (type $pair (descriptor $pair.desc) (struct (field i32 i64))) | |
| (type $pair.desc (describes $pair) (struct)) | |
| (type $other (struct)) | |
| ) | |
| (func (result (ref (exact $pair))) | |
| ;; The descriptor has the wrong heap type. | |
| (struct.new_default_desc $pair | |
| (struct.new $other) | |
| ) | |
| ) | |
| ) | |
| "struct.new descriptor operand should have proper type" | |
| ) |