From aae873c0449dc67995d02ce9f1e65b2c49065888 Mon Sep 17 00:00:00 2001 From: Zack Puhl Date: Wed, 6 Aug 2025 07:55:39 -0400 Subject: [PATCH] Add `bitsizeof` to Builtins (#2376) * Add `bitsizeof` to Builtins --------- Co-authored-by: Christoffer Lerno --- lib/std/core/builtin.c3 | 4 ++++ releasenotes.md | 1 + test/unit/stdlib/core/builtintests.c3 | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/lib/std/core/builtin.c3 b/lib/std/core/builtin.c3 index da19078dc..0c963159a 100644 --- a/lib/std/core/builtin.c3 +++ b/lib/std/core/builtin.c3 @@ -89,6 +89,10 @@ macro void @swap(#a, #b) @builtin #b = temp; } +macro usz bitsizeof($Type) @builtin @const => $Type.sizeof * 8u; + +macro usz @bitsizeof(#expr) @builtin @const => $sizeof(#expr) * 8u; + <* Convert an `any` type to a type, returning an failure if there is a type mismatch. diff --git a/releasenotes.md b/releasenotes.md index 5bce9ba3b..4c7eff823 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -6,6 +6,7 @@ - Support `alias foo = module std::io` module aliasing. - Add compile-time `@intlog2` macro to math. - Add compile-time `@clz` builtin. #2367 +- Add `bitsizeof` macro builtins. #2376 ### Fixes - List.remove_at would incorrectly trigger ASAN. diff --git a/test/unit/stdlib/core/builtintests.c3 b/test/unit/stdlib/core/builtintests.c3 index 436d6b77f..6f436a6ed 100644 --- a/test/unit/stdlib/core/builtintests.c3 +++ b/test/unit/stdlib/core/builtintests.c3 @@ -184,3 +184,22 @@ fn void test_ct_clz() assert(@clz((uint128)0x87) == 120); assert(@clz((char)(0x44 - 0x40)) == 5); } + +fn void test_bitsizeof() +{ + assert(bitsizeof(uint128) == 128); + assert(bitsizeof(ulong) == 64); + assert(bitsizeof(int) == 32); + assert(bitsizeof(short) == 16); + assert(bitsizeof(char) == 8); + assert(bitsizeof(char[200]) == 1600); + + // Checks that they may be converted + int x = bitsizeof(char); + int y = @bitsizeof(1); + + assert(@bitsizeof((char)0x07) == 8); + assert(@bitsizeof(0x1000ul) == 64); + assert(@bitsizeof(0) == 32); + assert(@bitsizeof((char[*])"abcdefghi") == 72); +} \ No newline at end of file