(module
(func (export "test")
(block $default
(block $1
(block $2
(br_table $1 $2 $default (i32.const -5))))))
)
(assert_return (invoke "test"))
The spec says l* for the br_table instruction here is [$1 $2], with indices [0, 1], and l_N is $default. The two rules for br_table based on the value i, which is -5 here, are:
br l_i ;; if i < len(l*)
br l_N ;; otherwise
In this case, i < len(l*) is true since -5 < 2, which would mean the machine would try to lookup l*[-5], which is meaningless.
The reference spec interpreter seems use the $default label here, which suggests it requires that i >= 0 before the br l_i rule is invoked.
br l_i ;; if i >= 0 && i < len(l*)