Fix validator
diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 509082d..63829bd 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp
@@ -3659,10 +3659,10 @@ Type(HeapTypes::sharedWaitqueue, Nullable), curr, "struct.wait waitqueue must be a shared waitqueue reference"); - shouldBeEqual(curr->timeout->type, - Type(Type::BasicType::i64), - curr, - "struct.wait timeout must be an i64"); + shouldBeEqualOrFirstIsUnreachable(curr->timeout->type, + Type(Type::BasicType::i64), + curr, + "struct.wait timeout must be an i64"); if (curr->ref->type == Type::unreachable || curr->ref->type.isNull()) { return; @@ -3717,10 +3717,10 @@ Type(HeapTypes::sharedWaitqueue, Nullable), curr, "waitqueue.notify waitqueue must be a shared waitqueue reference"); - shouldBeEqual(curr->count->type, - Type(Type::BasicType::i32), - curr, - "waitqueue.notify count must be an i32"); + shouldBeEqualOrFirstIsUnreachable(curr->count->type, + Type(Type::BasicType::i32), + curr, + "waitqueue.notify count must be an i32"); } void FunctionValidator::visitArrayNew(ArrayNew* curr) {
diff --git a/test/spec/waitqueue.wast b/test/spec/waitqueue.wast index da15357..d89d4da 100644 --- a/test/spec/waitqueue.wast +++ b/test/spec/waitqueue.wast
@@ -82,16 +82,26 @@ ;; unreachable is allowed (module (type $t (shared (struct (field i32)))) + (global $g (ref $t) (struct.new $t (i32.const 0))) (global $wq (ref (shared waitqueue)) (waitqueue.new)) (func (param $expected i32) (param $timeout i64) (result i32) (struct.wait $t 0 (unreachable) (global.get $wq) (local.get $expected) (local.get $timeout)) ) (func (param $expected i32) (param $timeout i64) (result i32) - (struct.wait $t 0 (ref.null $t) (unreachable) (local.get $expected) (local.get $timeout)) + (struct.wait $t 0 (global.get $g) (unreachable) (local.get $expected) (local.get $timeout)) + ) + (func (param $timeout i64) (result i32) + (struct.wait $t 0 (global.get $g) (global.get $wq) (unreachable) (local.get $timeout)) + ) + (func (param $expected i32) (result i32) + (struct.wait $t 0 (global.get $g) (global.get $wq) (local.get $expected) (unreachable)) ) (func (param $count i32) (result i32) (waitqueue.notify (unreachable) (local.get $count)) ) + (func (result i32) + (waitqueue.notify (global.get $wq) (unreachable)) + ) ) ;; i32 control word