diff --git a/std/sys/windows/event.wave b/std/sys/windows/event.wave index 38b52c52..00d6b5d4 100644 --- a/std/sys/windows/event.wave +++ b/std/sys/windows/event.wave @@ -89,6 +89,7 @@ pub fun event_wait( || capacity > WINDOWS_EVENT_CAPACITY || timeout_ms < -1) { return -22; } var descriptors: array; var count: i32 = deref state.count; + if (count == 0) { return 0; } var i: i32 = 0; while (i < count) { descriptors[i] = PollFd { diff --git a/tests/boundary_regressions.rs b/tests/boundary_regressions.rs index 56b871e4..b2a24fd3 100644 --- a/tests/boundary_regressions.rs +++ b/tests/boundary_regressions.rs @@ -234,3 +234,42 @@ fn read_to_end_rejects_capacity_overflow_and_preserves_normal_growth() { fs::write(case.root.join("empty.bin"), []).unwrap(); case.run(&source("tests/fixtures/boundaries/read_to_end.wave")); } +#[test] +#[cfg(windows)] +fn empty_windows_event_set_returns_zero() { + let case = Case::new("empty-windows-event"); + + let path = case.root.join("empty_event.wave"); + + fs::write( + &path, + r#" +import("std::sys::event")::{ + NativeEvent, event_create, event_wait, event_close +}; + +fun main() -> i32 { + var handle: i64 = event_create(4); + if (handle < 0) { return 1; } + + var events: array; + var count: i64 = event_wait(handle, &events[0], 4, 0); + + event_close(handle); + + if (count != 0) { return 2; } + return 0; +} +"#, + ) + .unwrap(); + + success( + case.command() + .arg("build") + .arg(&path) + .arg("--run") + .output() + .unwrap(), + ); +}