From 9fbf6bc213c98c126f59a40f2c43d0ee026c19c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20L=C3=B3pez=20Guevara?= Date: Wed, 18 Feb 2026 10:34:41 -0300 Subject: [PATCH] enforce buff channel size > 0 (#2952) * fix(stdlib): enforce BufferedChannel size > 0 and add regression test * chore(repo): ignore cmake/test artifacts * Formatting --------- Co-authored-by: Christoffer Lerno --- .gitignore | 7 +++++-- lib/std/threads/buffered_channel.c3 | 4 +++- test/test_suite/stdlib/channels.c3 | 8 ++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 test/test_suite/stdlib/channels.c3 diff --git a/.gitignore b/.gitignore index e8fb1a900..d153fdb17 100644 --- a/.gitignore +++ b/.gitignore @@ -73,6 +73,9 @@ out/ /cmake-build-debug/ /cmake-build-release/ +CMakeFiles/cmake.check_cache +CMakeCache.txt + # etags(Emacs), ctags, gtags TAGS GPATH @@ -94,8 +97,8 @@ result # tests /test/tmp/* -/test/testrun -/test/test_suite_runner +testrun +test_suite_runner # patches, originals and rejects *.patch diff --git a/lib/std/threads/buffered_channel.c3 b/lib/std/threads/buffered_channel.c3 index 1986f2a0f..d8868775c 100644 --- a/lib/std/threads/buffered_channel.c3 +++ b/lib/std/threads/buffered_channel.c3 @@ -21,6 +21,9 @@ struct BufferedChannelImpl @private Type[*] buf; } +<* + @require size > 0: "channel size must be > 0" +*> fn void? BufferedChannel.init(&self, Allocator allocator, usz size = 1) { BufferedChannelImpl* channel = allocator::new_with_padding(allocator, BufferedChannelImpl, Type.sizeof * size)!; @@ -155,4 +158,3 @@ fn void? BufferedChannel.close(self) @maydiscard // Remove optional in 0.8.0 channel.mu.unlock(); } - diff --git a/test/test_suite/stdlib/channels.c3 b/test/test_suite/stdlib/channels.c3 new file mode 100644 index 000000000..5cd304456 --- /dev/null +++ b/test/test_suite/stdlib/channels.c3 @@ -0,0 +1,8 @@ +import std::thread; + +fn int main() +{ + BufferedChannel{int} c; + c.init(mem, 0)!!; // #error: @require "size > 0" violated: 'channel size must be > 0'. + return 0; +}