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