;; Uninitialized undefaulted locals
(module
(func (export "get-after-set") (param $p (ref extern)) (result (ref extern))
(local $x (ref extern))
(local.set $x (local.get $p))
(local.get $x)
)
(func (export "get-after-tee") (param $p (ref extern)) (result (ref extern))
(local $x (ref extern))
(drop (local.tee $x (local.get $p)))
(local.get $x)
)
(func (export "get-in-block-after-set") (param $p (ref extern)) (result (ref extern))
(local $x (ref extern))
(local.set $x (local.get $p))
(block (result (ref extern)) (local.get $x))
)
)
(assert_return (invoke "get-after-set" (ref.extern 1)) (ref.extern 1))
(assert_return (invoke "get-after-tee" (ref.extern 2)) (ref.extern 2))
(assert_return (invoke "get-in-block-after-set" (ref.extern 3)) (ref.extern 3))
(assert_invalid
(module (func $uninit (local $x (ref extern)) (drop (local.get $x))))
"uninitialized local"
)
(assert_invalid
(module
(func $uninit-after-end (param $p (ref extern))
(local $x (ref extern))
(block (local.set $x (local.get $p)) (drop (local.tee $x (local.get $p))))
(drop (local.get $x))
)
)
"uninitialized local"
)
(assert_invalid
(module
(func $uninit-in-else (param $p (ref extern))
(local $x (ref extern))
(if (i32.const 0)
(then (local.set $x (local.get $p)))
(else (local.get $x))
)
)
)
"uninitialized local"
)
(assert_invalid
(module
(func $uninit-from-if (param $p (ref extern))
(local $x (ref extern))
(if (i32.const 0)
(then (local.set $x (local.get $p)))
(else (local.set $x (local.get $p)))
)
(drop (local.get $x))
)
)
"uninitialized local"
)
(module
(func (export "tee-init") (param $p (ref extern)) (result (ref extern))
(local $x (ref extern))
(drop (local.tee $x (local.get $p)))
(local.get $x)
)
)
(assert_return (invoke "tee-init" (ref.extern 1)) (ref.extern 1))