2 (func (export "f") (param $x i32) (result i32) (local.get $x))
7 (func $f (import "M" "f") (param i32) (result i32))
8 (func $g (param $x i32) (result i32)
9 (i32.add (local.get $x) (i32.const 1))
12 (global funcref (ref.func $f))
13 (global funcref (ref.func $g))
14 (global $v (mut funcref) (ref.func $f))
16 (global funcref (ref.func $gf1))
17 (global funcref (ref.func $gf2))
18 (func (drop (ref.func $ff1)) (drop (ref.func $ff2)))
19 (elem declare func $gf1 $ff1)
20 (elem declare funcref (ref.func $gf2) (ref.func $ff2))
26 (func (export "is_null-f") (result i32)
27 (ref.is_null (ref.func $f))
29 (func (export "is_null-g") (result i32)
30 (ref.is_null (ref.func $g))
32 (func (export "is_null-v") (result i32)
33 (ref.is_null (global.get $v))
36 (func (export "set-f") (global.set $v (ref.func $f)))
37 (func (export "set-g") (global.set $v (ref.func $g)))
40 (elem declare func $f $g)
42 (func (export "call-f") (param $x i32) (result i32)
43 (table.set $t (i32.const 0) (ref.func $f))
44 (call_indirect $t (param i32) (result i32) (local.get $x) (i32.const 0))
46 (func (export "call-g") (param $x i32) (result i32)
47 (table.set $t (i32.const 0) (ref.func $g))
48 (call_indirect $t (param i32) (result i32) (local.get $x) (i32.const 0))
50 (func (export "call-v") (param $x i32) (result i32)
51 (table.set $t (i32.const 0) (global.get $v))
52 (call_indirect $t (param i32) (result i32) (local.get $x) (i32.const 0))
56 (assert_return (invoke "is_null-f") (i32.const 0))
57 (assert_return (invoke "is_null-g") (i32.const 0))
58 (assert_return (invoke "is_null-v") (i32.const 0))
60 (assert_return (invoke "call-f" (i32.const 4)) (i32.const 4))
61 (assert_return (invoke "call-g" (i32.const 4)) (i32.const 5))
62 (assert_return (invoke "call-v" (i32.const 4)) (i32.const 4))
64 (assert_return (invoke "call-v" (i32.const 4)) (i32.const 5))
66 (assert_return (invoke "call-v" (i32.const 4)) (i32.const 4))
70 (func $f (import "M" "f") (param i32) (result i32))
71 (func $g (import "M" "g") (param i32) (result i32))
72 (global funcref (ref.func 7))
78 ;; Reference declaration
90 (global funcref (ref.func $f1))
91 (export "f" (func $f2))
92 (elem (table $t) (i32.const 0) func $f3)
93 (elem (table $t) (i32.const 0) funcref (ref.func $f4))
95 (elem funcref (ref.func $f6))
109 (module (func $f (drop (ref.func $f))))
110 "undeclared function reference"
113 (module (start $f) (func $f (drop (ref.func $f))))
114 "undeclared function reference"