# C3C Release Notes ## 0.7.10 Change list ### Changes / improvements - C3 is now using its own LLVM libraries when building releases. - Method resolution and `$defined` now works together well unless definitions are out of order for real. - Improve error message when using functions as values #2856 - Improve support for Android with Termux. - Integrated download of the MSVC SDK when compiling for Windows. - For `c3c init` with library templates, provide example exported functions. #2898 - `unsigned % signed` and `unsigned / signed` is no longer allowed without explicit casts, except for const denominators. #2928 - New enum associated value syntax. - Individual warning settings added. - Change typedef and const enums to not convert from literals by default. - Add `@constinit` to allow old typedef behaviour. - Include actual element count in the error message when the array initializer size does not match the expected size. - Add `--print-large-functions` for checking which functions likely dominate the compile time. - Improve error message when providing `alias` with a typeid expression where a type was expected. #2944 - Const enums removed. - Constdef declarations introduced. - Properly support `@deprecated` as contract. - Support deprecating enum values. - Improve error when trying to use an extern const as a compile time constant. #2969 - `vendor-fetch` command now lists all available packages by default. #2976 - Typekind enums are changed CONST_ENUM -> CONSTDEF, DISTINCT -> TYPEDEF. ### Stdlib changes - Summarize sort macros as generic function wrappers to reduce the amount of generated code. #2831 - Remove dependency on temp allocator in String.join. - Remove dependency on temp allocator in File.open. - Added PEM encoding/decoding. #2858 - Add Murmur3 hash. - Add optional line-length limitations to `io::readline` and `io::readline_to_stream`. #2879 - Add Xorshiro128++. - Add single-byte code page support (DOS/OEM, Windows/ANSI, and ISO/IEC 8859). - Add `array::even`, `array::odd`, and `array::unlace` macros. #2892 - Add discrete and continuous distributions in `std::math::distributions`. - Add bitorder functions `store_le`, `load_le`, `store_be`, `store_le`. - Stream functions now use long/ulong rather than isz/usz for seek/available. - `instream.seek` is replaced by `set_cursor` and `cursor`. - `instream.available`, `cursor` etc are long/ulong rather than isz/usz to be correct on 32-bit. - Enable asynchronous, non-blocking reads of subprocess STDOUT/STDERR pipes on POSIX systems. ### Fixes - Add error message if directory with output file name already exists - Regression where nested lambdas would be evaluated twice. - Compiler crash when using arrays of vectors in lists. #2889 - Fix `list[0].i = 5` when `list[0]` returns a pointer. #2888 - Shadowing not detected for generic declarations #2876 - Const inline enums would not always implicitly get converted to the underlying type. - Update to dstring.append_string to take any type converting to String. - Flag `--cpu-flags` doesn't work if the first item is an exclusion. #2905 - Reallocating overaligned memory with the LibcAllocator was unsafe. - Using [] or .foo on $$ functions would not raise error but instead crash - Improved underlining errors/warnings when unicode is used. #2887 - Fix std::io::Formatter integer issue for large uint128 decimal values. - `--safe=no` disabled compile-time errors on compile-time known runtime @require checks #2936 - On assert known false, the message was not shown for no-args. - Adding the incorrect sized vector to a pointer vector would cause a crash. - Member access on a struct returned by the assignment expression, cause crash #2947 - Trying to slice an indexable type leads to misleading error message #2958 - Warn on use of visibility modifiers on methods. #2962 - Compiler crash using `??` with a `void?` macro #2973 ## 0.7.9 Change list ### Changes / improvements - Add `--custom-libc` option for custom libc implementations. - Support for NetBSD. - Testing for the presence of methods at the top level is prohibited previous to method registration. - `$$mask_to_int` and `$$int_to_mask` to create bool masks from integers and back. - Better error messages when slicing a pointer to a slice or vector. #2681 - Generics using ad-hoc `<...>` rather than module based. - Reduced memory usage for backtraces on Linux. - On win32 utf-8 console output is now enabled by default in compiled programs - Add `$$VERSION` and `$$PRERELEASE` compile time constants. - Require () around assignment in conditionals. #2716 - $$unaligned_load and $$unaligned_store now also takes a "is_volatile" parameter. - Module-based generics using {} is deprecated. - Create optional with `~` instead of `?`. `return io::EOF?;` becomes `return io::EOF~`. - Deprecated use of `?` to create optional. - Make `foo.$abc` implicitly mean `foo.eval("$abc")`. - Deprecating multi-level array length inference. `int[*][*]` is deprecated and will be removed 0.8.0. - Combining argument-less initialization with argument init for bitstructs is now allowed e.g. `{ .b, .c = 123 }`. ### Fixes - Remove use of LLVMGetGlobalContext for single module compilation. - Fixed bug where constants would get modified when slicing them. #2660 - Regression with npot vector in struct triggering an assert #2219. - Casting bitstruct to wider base type should be single step #2616. - Optional does not play well with bit ops #2618. - `Bytebuffer.grow` was broken #2622. - Hex escapes like `"\x80"` would be incorrectly lowered. #2623 - Ignore const null check on deref in `$defined` and `$sizeof` #2633. - Subscripting of constant slices would sometimes be considered non-constant #2635. - Compiler crash when concatenating structs and arrays to an untyped list. - Strings assigned to longer arrays would crash codegen, e.g. `char[10] x = "abcd`. - Typedefs and structs with inline types supporting lengthof would not work with lengthof #2641. - `$defined(foo())` now correctly errors if `foo()` would require a path. - `@if($defined((char*){}.foo()))` does not error if `foo` is missing. - Hard limit of 127 characters for identifiers. - `$$LINE` would sometimes yield the incorrect format. - Fix error message when a method has the wrong type for the first argument. - Unit tests allocating too much `tmem` without `@pool` would cause errors in unrelated tests. #2654 - Incorrect rounding for decimals in formatter in some cases. #2657 - Incorrectly using LLVMStructType when emitting dynamic functions on MachO #2666 - FixedThreadPool join did not work correctly. - Fix bug when creating bool vectors in certain cases. - Compiler assert when passing returning CT failure immediately rethrown #2689. - Converting between simd/non-simd bool vector would hit a compiler assert. #2691 - `i` suffixes were not caught when n < 8, causing an assert. - Parse error in `$defined` was not handled correctly, leading to an assertion. - Assert when struct/array size would exceed 4 GB. - Assert when encountering a malformed module alias. - Assert when encountering a test function with raw vaarg parameters. - `foo.x` was not always handled correctly when `foo` was optional. - `x'1234' +++ (ichar[1]) { 'A' }` would fail due to missing const folding. - Miscompilation: global struct with vector could generate an incorrect initializer. - `String.tokenize_all` would yield one too many empty tokens at the end. - `String.replace` no longer depends on `String.split`. - Fix the case where `\u` could crash the compiler on some platforms. - Designated initialization with ranges would not error on overflow by 1. - `io::read_fully` now handles unbounded streams properly. - Crash when doing a type property lookup for const inline enums in some cases #2717. - Incorrect alignment on typedef and local variable debug info. - Assert on optional-returning-function in a comma expression. #2722 - Creating recursive debug info for functions could cause assertions. - bitorder::read and bitorder::write may fail because of unaligned access #2734. - Fix `LinkedList.to_format` to properly iterate linked list for printing. - Hashing a vector would not use the entire vector in some cases. - Fix to `temp_directory` on Windows #2762. - Too little memory reserved when printing backtrace on Darwin #2698. - In some cases, a type would not get implicitly converted to a typeid #2764. - Assert on defining a const fault enum with enumerator and fault of the same name. #2732 - Passing a non-conststring to module attributes like @cname would trigger an assert rather than printing an error. #2771 - Passing different types to arg 1 and 2 for $$matrix_transpose would trigger an assert. #2771 - Zero init of optional compile time variable would crash the compiler. #2771 - Using multiple declaration for generics in generic module would fail. #2771 - Defining an extern const without a type would crash rather than print an error. #2771 - Typedef followed by brace would trigger an assert. #2771 - Union with too big member would trigger an assert. #2771 - Bitstruct with unevaluated user-defined type would cause a crash. #2771 - Using named parameters with builtins would cause a crash. #2771 - In some cases, using missing identifiers with builtins would cause a crash. #2771 - Using `$defined` with function call missing arguments would cause a crash. #2771 - Adding @nostrip to a test function would crash. #2771 - Mixing struct splat, non-named params and named params would crash rather than to print an error. #2771 - Creating a char vector from bytes would crash. #2771 - Using $$wstr16 with an illegal argument would crash instead of printing an error. #2771 - Empty struct after `@if` processing was not detected, causing a crash instead of an error. #2771 - Comparing an uint and int[<4>] was incorrectly assumed to be uint compared to int, causing a crash instead of an error. #2771 - When an `int[*][6]` was given too few values, the compiler would assert instead of giving an error. #2771 - Inferring length from a slice was accidentally not an error. - Eager evaluation of macro arguments would break inferred arrays on some platforms. #2771. - Vectors not converted to arrays when passed as raw vaargs. #2776 - Second value in switch range not checked properly, causing an error on non-const values. #2777 - Broken cast from fault to array pointer #2778. - $typeof untyped list crashes when trying to create typeid from it. #2779 - Recursive constant definition not properly detected, leading to assert #2780 - Failed to reject void compile time variables, leading to crash. #2781 - Inferring the size of a slice with an inner inferred array using {} isn't detected as error #2783 - Bug in sysv abi when passing union in with floats #2784 - When a global const has invalid attributes, handling is incorrect, leading to a crash #2785. - `int? ?` was not correctly handled. #2786 - Casting const bytes to vector with different element size was broken #2787 - Unable to access fields of a const inline enum with an aggregate underlying type. #2802 - Using an optional type as generic parameter was not properly caught #2799 - Instantiating an alias of a user-defined type was not properly caught #2798 - Too deeply nested scopes was a fatal crash and not a regular semantic error. #2796 - Recursive definition of tag not detected with nested tag/tagof #2790 - Attrdef eval environment lacked rtype, causing error on invalid args #2797 - $typeof() returns typeinfo, causing errors #2795. - Empty ichar slice + byte concatenation hit an assert. #2789 - Remove dependency on test tmp library for stdlib compiler tests. #2800 - Comparing a flexible array member to another type would hit an assert. #2830 - Underlying slice type not checked correctly in $defined #2829 - Checking for exhaustive cases is done even in if-chain switch if all is enum #2828 - Constant shifting incorrectly doesn't flatten the underlying vector base #2825 - String not set as attributes resolved breaking has_tagof #2824 - Self referencing forward resolved const enum fails to be properly detected #2823 - Incorrectly try compile time int check on vector #2815 - Generating typeid from function gives incorrect typeid #2816 - Recursive definitions not discovered when initializer is access on other const #2817 - Slice overrun detected late hit codegen assert #2822 - Compile time dereference of a constant slice was too generous #2821 - Constant deref of subscript had inserted checks #2818 - Raw vaargs with optional return not lowered correctly #2819 - Early exit in macro call crashes codegen #2820 - Empty enums would return the values as zero sized arrays #2838 - Store of zero in lowering did not properly handle optionals in some cases #2837 - Bitstruct accidentally allowed other arrays than char arrays #2836 - Bitstruct as substruct fails to properly work with designated initializers. #2827 - Bug when initializing an inferred array with deep structure using designated init #2826 - Packed .c3l files without compressions weren't unpacked correctly. - Lowering of optional in && was incorrect #2843 - Resolving &X.b when X is a const incorrectly checked for runtime constness #2842 - Alignment param on $$unaligned_* not checked for zero #2844 - Fix alignment for uint128 to 16 with WASM targets. - Incorrect assert in struct alignment checking #2841 - Packed structs sometimes not lowered as such. - Crash when creating `$Type*` where `$Type` is an optional type #2848 - Crashes when using `io::EOF~!` in various unhandled places. #2848 - Crash when trying to create a const zero untyped list #2847 - Incorrect handling when reporting fn with optional compile time type #2862 - Optional in initializer cause a crash #2864 - Negating a global address with offset was a counted as a global runtime constant #2865 - Converting static "make_slice" to array failed to be handled #2866 - Narrowing a not expression was incorrectly handled #2867 - Vector shift by optional scalar failed #2868 - Initializer did not correctly handle second rethrow #2870 - Crash encountering panic in if-else style switch #2871 - Crash in slice expression when it contains a rethrow #2872 - Multiple issues when rethrowing inside of expressions #2873 ### Stdlib changes - Add `ThreadPool` join function to wait for all threads to finish in the pool without destroying the threads. - Add `@in` compile-time macro to check for a value in a variable list of constants. #2662 - Return of Thread/Mutex/CondVar `destroy()` is now "@maydiscard" and should be ignored. It will return void in 0.8.0. - Return of Mutex `unlock()` and `lock()` is now "@maydiscard" and should be ignored. They will return void in 0.8.0. - Return of ConditionVariable `signal()` `broadcast()` and `wait()` are now "@maydiscard". They will return void in 0.8.0. - Return of Thread `detatch()` is now "@maydiscard". It will return void in 0.8.0. - Buffered/UnbufferedChannel, and both ThreadPools have `@maydiscard` on a set of functions. They will return void in 0.8.0. - Pthread bindings correctly return Errno instead of CInt. - Return of Thread `join()` is now "@maydiscard". - Add `poly1305` one-time Message Authentication Code and associated tests. #2639 - Add `ripemd` hashing and associated tests. #2663 - Add `chacha20` stream cipher and associated tests. #2643 - Add `BLAKE2` (optionally keyed) cryptographic hashing with associated tests. #2648 - Add `BLAKE3` XOF and associated tests. #2667 - Add `Elf32_Shdr` and `Elf64_Shdr` to `std::os::linux`. - Add `any.to` and `any.as`. - Deprecated `DString.append_chars`, use `DString.append_string` - Deprecated `DString.append_string` for DStrings, use `DString.append_dstring` instead. - Added `DString.append_bytes`. - Add `streebog` (aka "GOST-12") hashing with 256-bit and 512-bit outputs. #2659 - Add unit tests for HMAC 256 based on RFC 4231. #2743 - Add extra `AsciiCharset` constants and combine its related compile-time/runtime macros. #2688 - Use a `Printable` struct for ansi RGB formatting instead of explicit allocation and deprecate the old method. - HashSet.len() now returns usz instead of int. #2740 - Add `mem::store` and `mem::load` which may combine both aligned and volatile operations. - Deprecated `EMPTY_MACRO_SLOT` and its related uses, in favor of `optional_param = ...` named macro arguments. #2805 - Add tracking of peak memory usage in the tracking allocator. - Added `realloc_array`, `realloc_array_aligned`, and `realloc_array_try` to `allocator::`. #2760 ## 0.7.8 Change list ### Changes / improvements - Improve multiline string parser inside compiler #2552. - Missing imports allowed if module `@if` evaluates to false #2251. - Add default exception handler to Win32 #2557. - Accept `"$schema"` as key in `project.json` #2554. - Function referencing in `@return?` for simplified fault declarations. Check `@return?` eagerly #2340. - Enums now work with `membersof` to return the associated values. #2571 - Deprecated `SomeEnum.associated` in favour of `SomeEnum.membersof` - Refactored `@simd` implementation. - Improve error message for `Foo{}` when `Foo` is not a generic type #2574. - Support `@param` directives for `...` parameters. #2578 - Allow splatting of structs. #2555 - Deprecate `--test-nocapture` in favour of `--test-show-output` #2588. - Xtensa target no longer enabled by default on LLVM 22, Compile with `-DXTENSA_ENABLE` to enable it instead - Add `float[<3>] x = { .xy = 1.2, .z = 3.3 }` swizzle initialization for vectors. #2599 - Support `int $foo...` arguments. #2601 - Add musl support with `--linux-libc=musl`. ### Fixes - `Foo.is_eq` would return false if the type was a `typedef` and had an overload, but the underlying type was not comparable. - Remove division-by-zero checks for floating point in safe mode #2556. - Fix division-by-zero checks on `a /= 0` and `b /= 0f` #2558. - Fix fmod `a %= 0f`. - Regression vector ABI: initializing a struct containing a NPOT vector with a constant value would crash LLVM. #2559 - Error message with hashmap shows "mangled" name instead of original #2562. - Passing a compile time type implicitly converted to a typeid would crash instead of producing an error. #2568 - Compiler assert with const enum based on vector #2566 - Fix to `Path` handling `c:\foo` and `\home` parent. #2569 - Fix appending to `c:\` or `\` #2569. - When encountering a foreach over a `ZString*` it would not properly emit a compilation error, but hit an assert #2573. - Casting a distinct type based on a pointer to an `any` would accidentally be permitted. #2575 - `overflow_*` vector ops now correctly return a bool vector. - Regression vector ABI: npot vectors would load incorrectly from pointers and other things. #2576 - Using `defer catch` with a (void), would cause an assertion. #2580 - Fix decl attribute in the wrong place causing an assertion. #2581 - Passing a single value to `@wasm` would ignore the renaming. - `*(int*)1` incorrectly yielded an assert in LLVM IR lowering #2584. - Fix issue when tests encounter a segmentation fault or similar. - With project.json, when overriding with an empty list the base settings would still be used. #2583 - Add sigsegv stacktrace in test and regular errors for Darwin Arm64. #1105 - Incorrect error message when using generic type that isn't imported #2589 - `String.to_integer` does not correctly return in some cases where it should #2590. - Resolving a missing property on a const enum with inline, reached an assert #2597. - Unexpected maybe-deref subscript error with out parameter #2600. - Bug on rethrow in return with defer #2603. - Fix bug when converting from vector to distinct type of wider vector. #2604 - `$defined(hashmap.init(mem))` causes compiler segfault #2611. - Reference macro parameters syntax does not error in certain cases. #2612 - @param name parsing too lenient #2614. ### Stdlib changes - Add `CGFloat` `CGPoint` `CGSize` `CGRect` types to core_foundation (macOS). - Add `NSStatusItem` const enum to ns module (macOS). - Add `NSWindowCollectionBehavior` `NSWindowLevel` `NSWindowTabbingMode` to ns module (macOS). - Add `ns::eventmask_from_type` function to objc (macOS). - Deprecate objc enums in favour of const inline enums backed by NS numerical types, and with the NS prefix, to better align with the objc api (macOS). - Deprecate `event_type_from` function in favour of using NSEvent directly, to better align with the objc api (macOS). - Add unit tests for objc and core_foundation (macOS). - Make printing typeids give some helpful typeid data. - Add `NSApplicationTerminateReply` to ns module (macOS). - Add `registerClassPair` function to objc module (macOS). - Somewhat faster BigInt output. - Cache printf output. ## 0.7.7 Change list ### Changes / improvements - Error when using $vaarg/$vacount/$vasplat and similar in a macro without vaargs #2510. - Add splat defaults for designated initialization #2441. - Add new builtins `$$str_snakecase` `$$str_replace` and `$$str_pascalcase`. - `"build-dir"` option now available for `project.json`, added to project. #2323 - Allow `..` ranges to use "a..a-1" in order to express zero length. - Disallow aliasing of `@local` symbols with a higher visibility in the alias. - Add `--max-macro-iterations` to set macro iteration limit. - Improved generic inference in initializers #2541. - "Maybe-deref" subscripting `foo.[i] += 1` #2540. - ABI change for vectors: store and pass them as arrays #2542. - Add @simd and @align attributes to typedef #2543. - Rename `@extern` to `@cname`, deprecating the old name #2493. - Allow `(Foo)0` bitstruct casts even if type sizes do not match. - The option `--riscvfloat` renamed `--riscv-abi`. - Add initial `--cpu-flags` allowing fine grained control over CPU features. - Add `--riscv-cpu` settings for RISC-V processors #2549. ### Fixes - Bug in `io::write_using_write_byte`. - Bitstruct value cannot be used to index a const array in compile time. #2512 - Compiler fails to stop error print in recursive macro, and also prints unnecessary "inline at" #2513. - Bitstruct truncated constant error escapes `$defined` #2515. - Compiler segfault when accessing member of number cast to bitstruct #2516. - Compiler assert when getting a member of a `bitstruct : char @bigendian` #2517. - Add ??? and +++= to list-precedence. - Fix issues with linking when using symbol aliases. #2519 - Splatting optional compile-time macro parameter from inside lambda expression does not work #2532. - Compiler segfault when getting a nonexistant member from an unnamed struct #2533. - Correctly mention aliased type when method is not implemented #2534. - Regression: Not printing backtrace when tests fail for MacOS #2536. - Name property would be used even under `c3c test` #2587. ### Stdlib changes - Sorting functions correctly took slices by value, but also other types by value. Now, only slices are accepted by value, other containers are always by ref. - Added `@str_snakecase`, `@str_replace` and `@str_pascalcase` builtin compile time macros based on the `$$` builtins. - Add TcpSocketPair to create a bidirectional local socket pair. - Add `extern fn CInt socketpair(AIFamily domain, AISockType type, CInt protocol, NativeSocket[2]* sv)` binding to posix. - Add `extern fn getsockname(NativeSocket socket, SockAddrPtr address, Socklen_t* address_len)` binding to win32. ## 0.7.6 Change list ### Changes / improvements - Add lengthof() compile time function #2439 - Allow doc comments on individual struct members, faultdefs and enum values #2427. - `$alignof`, `$offsetof` and `$nameof` can now be used in `$defined`. - Infer generic parameters lhs -> rhs: `List{int} x = list::NOHEAP`. - Unify generic and regular module namespace. - `env::PROJECT_VERSION` now returns the version in project.json. - Comparing slices and arrays of user-defined types that implement == operator now works #2486. - Add 'loop-vectorize', 'slp-vectorize', 'unroll-loops' and 'merge-functions' optimization flags #2491. - Add exec timings to -vv output #2490. - Support #! as a comment on the first line only. - Add `+++=` operator. ### Fixes - Compiler assert with var x @noinit = 0 #2452 - Confusing error message when type has [] overloaded but not []= #2453 - $defined(x[0] = val) causes an error instead of returning false when a type does not have []= defined #2454 - Returning pointer to index of slice stored in a struct from method taking self incorrectly detected as returning pointer to local variable #2455. - Inlining location when accessing #foo symbols. - Improve inlined-at when checking generic code. - Fix codegen bug in expressions like `foo(x()) ?? io::EOF?` causing irregular crashes. - Correctly silence "unsupported architecture" warning with `--quiet` #2465 - Overloading &[] should be enough for foreach. #2466 - Any register allowed in X86_64 inline asm address. #2463 - int val = some_int + some_distinct_inline_int errors that int cannot be cast to DistinctInt #2468 - Compiler hang with unaligned load-store pair. #2470 - `??` with void results on both sides cause a compiler crash #2472. - Stack object size limit error on a static object. #2476 - Compiler segfault when modifying variable using an inline assembly block inside defer #2450. - Compile time switch over type would not correctly compare function pointer types. - Regression: Compiler segfault when assigning struct literal with too few members #2483 - Fix compile time format check when the formatting string is a constant slice. - Compiler segfault for invalid e-mails in project.json. #2488 - Taking `.ordinal` from an enum passed by pointer and then taking the address of this result would return the enum, not int. - Alias and distinct types didn't check the underlying type wasn't compile time or optional. - Incorrect nameof on nested struct names. #2492 - Issue not correctly aborting compilation on recursive generics. - Crash during codegen when taking the typeid of an empty enum with associated values. - Assert when the binary doesn't get created and --run-once is used. #2502 - Prevent `foo.bar = {}` when `bar` is a flexible array member. #2497 - Fix several issues relating to multi-level inference like `int[*][*]` #2505 - `$for int $a = 1; $a < 2; $a++` would not parse. - Fix lambda-in-macro visibility, where lambdas would sometimes not correctly link if used through a macro. - Dead code analysis with labelled `if` did not work properly. - Compiler segfault when splatting variable that does not exist in untyped vaarg macro #2509 ### Stdlib changes - Added Advanced Encryption Standard (AES) algorithm (ECB, CTR, CBC modes) in `std::crypto::aes`. - Added generic `InterfaceList` to store a list of values that implement a specific interface - Added `path::home_directory`, `path::documents_directory`, `path::videos_directory`, `path::pictures_directory`, `path::desktop_directory`, `path::screenshots_directory`, `path::public_share_directory`, `path::templates_directory`, `path::saved_games_directory`, `path::music_directory`, `path::downloads_directory`. - Add `LinkedList` array_view to support `[]` and `foreach`/`foreach_r`. #2438 - Make `LinkedList` printable and add `==` operator. #2438 - CVaList support on MacOS aarch64, SysV ABI x64. - Add `io::skip` and `io::read_le` and `io::write_le` family of functions. ## 0.7.5 Change list ### Changes / improvements - 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 - Add compile-time `@min` and `@max` builtins. #2378 - Deprecate `@compact` use for comparison. Old behaviour is enabled using `--use-old-compact-eq`. - Switch available for types implementing `@operator(==)`. - `Type.is_eq` is now true for types with `==` overload. - Methods ignore visibility settings. - Allow inout etc on untyped macro parameters even if they are not pointers. - Deprecate `add_array` in favour of `push_all` on lists. - Fix max module name to 31 chars and the entire module path to 63 characters. - Improve error message for missing `$endif`. - `foo[x][y] = b` now interpreted as `(*&foo[x])[y] = b` which allows overloads to do chained [] accesses. - Error if a stack allocated variable is too big (configurable with `--max-stack-object-size`). - Add `@safeinfer` to allow `var` to be used locally. - Types converts to typeid implicitly. - Allow `$defined` take declarations: `$defined(int x = y)` - Struct and typedef subtypes inherit dynamic functions. - Improved directory creation error messages in project and library creation commands. - `@assignable_to` is deprecated in favour of `$define` - Add `linklib-dir` to c3l-libraries to place their linked libraries in. Defaults to `linked-libs` - If the `os-arch` linked library doesn't exist, try with `os` for c3l libs. - A file with an inferred module may not contain additional other modules. - Update error message for missing body after if/for/etc #2289. - `@is_const` is deprecated in favour of directly using `$defined`. - `@is_lvalue(#value)` is deprecated in favour of directly using `$defined`. - Added `$kindof` compile time function. - Deprecated `@typekind` macro in favour of `$kindof`. - Deprecated `@typeis` macro in favour of `$typeof(#foo) == int`. - `$defined(#hash)` will not check the internal expression, just that `#hash` exists. Use `$defined((void)#hash)` for the old behaviour. - Added optional macro arguments using `macro foo(int x = ...)` which can be checked using `$defined(x)`. - Add compile time ternary `$val ??? : `. ### Fixes - List.remove_at would incorrectly trigger ASAN. - With avx512, passing a 512 bit vector in a union would be lowered incorrectly, causing an assert. #2362 - Codegen error in `if (try x = (true ? io::EOF? : 1))`, i.e. using if-try with a known Empty. - Codegen error in `if (try x = (false ? io::EOF? : 1))`, i.e. using if-try with a CT known value. - Reduce allocated Vmem for the compiler on 32 bit machines. - Bug causing a compiler error when parsing a broken lambda inside of an expression. - Fixed: regression in comments for `@deprecated` and `@pure`. - Detect recursive creation of generics #2366. - Compiler assertion when defining a function with return type untyped_list #2368. - Compiler assert when using generic parameters list without any parameters. #2369 - Parsing difference between "0x00." and "0X00." literals #2371 - Fixed bug generating `$c += 1` when `$c` was derived from a pointer but behind a cast. - Compiler segfault when using bitwise not on number literal cast to bitstruct #2373. - Formatter did not properly handle "null" for any, and null for empty faults. #2375 - Bitstructs no longer overloadable with bitops. #2374 - types::has_equals fails with assert for bitstructs #2377 - Fix `native_cpus` functionality for OpenBSD systems. #2387 - Assert triggered when trying to slice a struct. - Improve codegen for stack allocated large non-zero arrays. - Implement `a5hash` in the compiler for compile-time `$$str_hash` to match `String.hash()`. - Functions being tested for overload are now always checked before test. - Compile time indexing at compile time in a $typeof was no considered compile time. - Slicing a constant array with designated initialization would not update the indexes. - Fix for bug when `@format` encountered `*` in some cases. - Compiler segfault on global slice initialization with null[:0] #2404. - Use correct allocator in `replace`. - Regression: 1 character module names would create an error. - Compiler segfault with struct containing list of structs with an inline member #2416 - Occasionally when using macro method extensions on built-in types, the liveness checker would try to process them. #2398 - Miscompilation of do-while when the while starts with a branch #2394. - Compiler assert when calling unassigned CT functions #2418. - Fixed crash in header generation when exporting functions with const enums (#2384). - Fix incorrect panic message when slicing with negative size. - Incorrect type checking when &[] and [] return optional values. - Failed to find subscript overloading on optional values. - `Socket.get_option` didn't properly call `getsockopt`, and `getsockopt` had an invalid signature. - Taking the address of a label would cause a crash. #2430 - `@tag` was not allowed to repeat. - Lambdas on the top level were not exported by default. #2428 - `has_tagof` on tagged lambdas returns false #2432 - Properly add "inlined at" for generic instantiation errors #2382. - Inlining a const as an lvalue would take the wrong path and corrupt the expression node. - Grabbing (missing) methods on function pointers would cause crash #2434. - Fix alignment on jump table. - Fix correct `?` after optional function name when reporting type errors. - Make `log` and `exp` no-strip. - `@test`/`@benchmark` on module would attach to interface and regular methods. - Deprecated `@select` in favor of `???`. - Enum inference, like `Foo x = $eval("A")`, now works correctly for `$eval`. - Fix regression where files were added more than once. #2442 - Disambiguate types when they have the same name and need cast between each other. - Compiler module-scope pointer to slice with offset, causes assert. #2446 - Compiler hangs on == overload if other is generic #2443 - Fix missing end of line when encountering errors in project creation. - Const enum methods are not being recognized. #2445 - $defined returns an error when assigning a struct initializer with an incorrect type #2449 ### Stdlib changes - Add `==` to `Pair`, `Triple` and TzDateTime. Add print to `Pair` and `Triple`. - Add OpenBSD to `env::INET_DEVICES` and add required socket constants. - Added `FileMmap` to manage memory mapped files. - Add `vm::mmap_file` to memory map a file. - Updated hash functions in default hash methods. - Added `FixedBlockPool` which is a memory pool for fixed size blocks. - Added the experimental `std::core::log` for logging. - Added array `@zip` and `@zip_into` macros. #2370 - Updated termios bindings to use bitstructs and fixed some constants with incorrect values #2372 - Add Freestanding OS types to runtime `env::` booleans. - Added libloaderapi to `std::os::win32`. - Added `HashSet.values` and `String.contains_char` #2386 - Added `&[]` overload to HashMap. - Deprecated `PollSubscribes` and `PollEvents` in favour of `PollSubscribe` and `PollEvent` and made them const enums. - Added `AsciiCharset` for matching ascii characters quickly. - Added `String.trim_charset`. - Added array `@reduce`, `@filter`, `@any`, `@all`, `@sum`, `@product`, and `@indices_of` macros. - `String.bformat` has reduced overhead. - Supplemental `roundeven` has a normal implementation. ## 0.7.4 Change list ### Changes / improvements - Added const enums: `enum Foo : const`. Behaves like C enums but may be any type. - Casting to / from an enum is now possible again. No need to use `.ordinal` and `.from_ordinal`. - Inline associated enum values are deprecated, use `--use-old-enums` to re-enable them. - `$typeof` may return a compile time type. - Improved error messages on missing qualifier on enum value. #2260 - Add `--echo-prefix` to edit the prefix with `$echo` statements. Supports {FILE} and {LINE} - Catch accidental `foo == BAR;` where `foo = BAR;` was most likely intended. #2274 - Improve error message when doing a rethrow in a function that doesn't return an optional. - Add `--list-asm` to view all supported `asm` instructions. - Formatting option "%h" now supports pointers. - Improve error on unsigned implicit conversion to signed. - Update error message for struct initialization #2286 - Add SipHash family of keyed PRFs. #2287 - `$is_const` is deprecated in favour of `@is_const` based on `$defined`. - Multiline contract comments #2113 - Removed the use of temp allocator in backtrace printing. - `env::AUTHORS` and `env::AUTHOR_EMAILS` added. - Suppress codegen of panic printing with when panic messages are set to "off". - Implicit linking of libc math when libc math functions are used. - Allow even smaller memory limits. - Check unaligned array access. - Add "@structlike" for typedefs. - "poison" the current function early when a declaration can't be correctly resolved. - Add komihash, a5hash, metrohash64, metrohash128, and wyhash2 variants with tests/benchmark. #2293 - '$assignable' is deprecated. - Deprecate allocator::heap() and allocator::temp() - Add `thread::fence` providing a thread fence. - Place output in `out` by default for projects. Use temp folder for building at the command line. - Allow absolute paths for `$embed`. - Add `@try` and `@try_catch`. - Assignment evaluation order now right->left, following C++17 and possibly C23. ### Fixes - mkdir/rmdir would not work properly with substring paths on non-windows platforms. - Hex string formatter check incorrectly rejected slices. - Correctly reject interface methods `type` and `ptr`. - Comparing a null ZString with a non-null ZString would crash. - Switch case with const non-int / enum would be treated as ints and crash. #2263 - Missing bounds check on upper bound with const ranges `foo[1:3]`. - Check up the hierarchy when considering if an interface cast is valid #2267. - Fix issue with labelled break inside of a $switch. - Non-const macros may not return untyped lists. - `$for` ct-state not properly popped. - Inline `r / complex` for complex numbers fixed. - Const slice lengths were not always detected as constant. - Const slice indexing was not bounds checked. - Initialize pool correctly in print_backtrace. - `--max-mem` now works correctly again. - Casting a fault to a pointer would trigger an assert. - Make `to_float` more tolerant to spaces. - Fixes to thread local pointer handling. - Fixes to JSON parsing and Object. - Array indices are now using int64 internally. - Bit shift operation fails with inline uint enum despite matching underlying type #2279. - Fix to codegen when using a bitstruct constant defined using a cast with an operator #2248. - Function pointers are now compile time constants. - Splat 8 arguments can sometimes cause incorrect behaviour in the compiler. #2283 - Correctly poison the analysis after a failed $assert or $error. #2284 - `$foo` variables could be assigned non-compile time values. - `$foo[0] = ...` was incorrectly requiring that the assigned values were compile time constants. - "Inlined at" would sometimes show the current location. - Fixed bug splatting constants into constants. - Resize bug when resizing memory down in ArenaAllocator, DynamicArenaAllocator, BackedArenaAllocator. - Error message for missing arg incorrect for methods with zero args #2296. - Fix stringify of $vaexpr #2301. - Segfault when failing to cast subexpression to 'isz' in pointer subtraction #2305. - Fix unexpected display of macro definition when passing a poisoned expression #2305. - `@links` on macros would not be added to calling functions. - Fix `Formatter.print` returning incorrect size. - A distinct type based on an array would yield .len == 0 - Overloading addition with a pointer would not work. - Copying const enums and regular enums incorrect #2313. - Regression: Chaining an optional together with contracts could in some cases lose the optional. - `char[*] b = *(char[*]*)&a;` would crash the compiler if `a` was a slice. #2320 - Implicitly cast const int expressions would sometimes not be detected as compile time const. - Using @noreturn in a short body macro would not work properly #2326. - Bug when reporting error in a macro return would crash the compiler #2326. - Short body return expression would not have the correct span. - Fix issue where recursively creating a dir would be incorrectly marked as a failure the first time. - `@format` did not work correctly with macros #2341. - Crash when parsing recursive type declaration #2345. - Remove unnecessary "ret" in naked functions #2344. - Lambdas now properly follow its attributes #2346. - Not setting android-ndk resulted in a "set ndk-path" error. - Lambda deduplication would be incorrect when generated at the global scope. - Disallow accessing parameters in a naked function, as well as `return`, this fixes #1955. - Assigning string literal to char[<*>] stores pointer rather than characters. #2357 ### Stdlib changes - Improve contract for readline. #2280 - Added Whirlpool hash. - Added Ed25519. - Added string::bformat. - Virtual memory library. - New virtual memory arena allocator. - Added `WString.len`. - Added `@addr` macro. - Add `ConditionVariable.wait_until` and `ConditionVariable.wait_for` - Added readline_to_stream that takes a stream. - Added `Ref` and `RefCounted` experimental functionality. - Added `Volatile` generic type. - Added `UnalignedRef` generic type. - Added `HashSet` generic type. - Added `LinkedHashSet` and `LinkedHashMap` generic types. - Add String conversion functions snake_case -> PascalCase and vice versa. ## 0.7.3 Change list ### Changes / improvements - `$typefrom` now also accepts a constant string, and so works like `$evaltype`. - `$evaltype` is deprecated in favour of `$typefrom`. - Literal rules have changed, this makes `-0xFF` now a signed integer. - Implicitly convert from constant typeid to Type in `$Type` assignment, and `$assignable`. - Make $Type parameters accept constant typeid values. - Deprecate `foo.#bar`. - Allow inference across `&&` #2172. - Added support for custom file extensions in project.json targets. - `$eval` now also works with `@foo`, `#foo`, `$Foo` and `$foo` parameters #2114. - `@sprintf` macro (based on the `$$sprintf` builtin) allows compile time format strings #1874. - Improve error reports when encountering a broken "if-catch". - Add printf format to `$assert` and `$error` #2183. - Make accepting arguments for `main` a bit more liberal, accepting `main(int argc, ZString* argv)` - Make `$echo` and `@sprintf` correctly stringify compile time initializers and slices. - Add `--sources` build option to add additional files to compile. #2097 - Support untyped second argument for operator overloading. - The form-feed character '\f' is no longer valid white space. - Show code that caused unreachable code #2207 - Allow generics over distinct types #2216. - Support distrinct types as the base type of bitstructs. #2218 - Add hash::sha512 module to stdlib. #2227 - Compile time type assignment (eg `$Foo = int`) is no longer an expression. - Add `@allow_deprecated` attribute to functions to selectively allow deprecated declarations #2223. - Improve error message on pointer diff #2239. - Compile-time comparison of constant vectors. #1575. - $member.get supports bitstructs. - $member.set for setting members without the *& trick. - Initial support for #1925, does not affect C compilation yet, and doesn't try to link etc. Using "--emit-only" ### Fixes - `-2147483648`, MIN literals work correctly. - Splatting const slices would not be const. #2185 - Fixes to `$define` handling of binary ops. - Fixes methodsof to pick up all sorts of extension methods. #2192 - `--lsp` sometimes does not emit end tag #2194. - Improve Android termux detection. - Update Android ABI. - Fixes to `@format` checking #2199. - Distinct versions of builtin types ignore @operator overloads #2204. - @operator macro using untyped parameter causes compiler segfault #2200. - Make `unreachable()` only panic in safe mode. - `cflags` additions for targets was not handed properly. #2209 - `$echo` would suppress warning about unreachable code. #2205 - Correctly format '%c' when given a width. #2199 - Fix to `is_array_or_slice_of_char` #2214. - Method on array slice caused segfault #2211. - In some cases, the compiler would dereference a compile time null. #2215 - Incorrect codegen if a macro ends with unreachable and is assigned to something. #2210 - Fix error for named arguments-order with compile-time arguments #2212 - Bug in AST copying would make operator overloading like `+=` compile incorrectly #2217. - `$defined(#expr)` broken with binary. #2219 - Method ambiguity when importing parent module publicly in private submodule. #2208 - Linker errors when shadowing @local with public function #2198 - Bug when offsetting pointers of large structs using ++ and --. - `x++` and `x--` works on pointer vectors #2222. - `x += 1` and `x -= 1` works properly on pointer vectors #2222. - Fixes to `x += { 1, 1 }` for enum and pointer vectors #2222. - Linking fails on operator method imported as `@public` #2224. - Lambda C-style vaargs were not properly rejected, leading to crash #2229. - Incorrect handling of constant null fault causing compiler crash #2232. - Overload resolution fixes to inline typedef #2226. - `math::overflow_*` wrappers incorrectly don't allow distinct integers #2221. - Compiler segfault when using distinct type in attribute imported from other module #2234. - Assert casting bitstruct to short/char #2237. - @tag didn't work with members #2236. - Assert comparing untyped lists #2240. - Fix bugs relating to optional interface addr-of #2244. - Compiler null pointer when building a static-lib with -o somedir/... #2246 - Segfault in the compiler when using a bitstruct constant defined using a cast with an operator #2248. - Default assert() message drops parens #2249. ### Stdlib changes - Deprecate `String.is_zstr` and `String.quick_zstr` #2188. - Add comparison with `==` for ZString types. - `is_array_or_slice_of_char` and `is_arrayptr_or_slice_of_char` are replaced by constant `@` variants. - `@pool` now has an optional `reserve` parameter, some minor changes to the temp_allocator API - io::struct_to_format now supports bitstructs. - Add `String.escape`, `String.unescape` for escaping and unescaping a string. ## 0.7.2 Change list ### Changes / improvements - Better default assert messages when no message is specified #2122 - Add `--run-dir`, to specify directory for running executable using `compile-run` and `run` #2121. - Add `run-dir` to project.json. - Add `quiet` to project.json. - Deprecate uXX and iXX bit suffixes. - Add experimental LL / ULL suffixes for int128 and uint128 literals. - Allow the right hand side of `|||` and `&&&` be runtime values. - Added `@rnd()` compile time random function (using the `$$rnd()` builtin). #2078 - Add `math::@ceil()` compile time ceil function. #2134 - Improve error message when using keywords as functions/macros/variables #2133. - Deprecate `MyEnum.elements`. - Deprecate `SomeFn.params`. - Improve error message when encountering recursively defined structs. #2146 - Limit vector max size, default is 4096 bits, but may be increased using --max-vector-size. - Allow the use of `has_tagof` on builtin types. - `@jump` now included in `--list-attributes` #2155. - Add `$$matrix_mul` and `$$matrix_transpose` builtins. - Add `d` as floating point suffix for `double` types. - Deprecate `f32`, `f64` and `f128` suffixes. - Allow recursive generic modules. - Add deprecation for `@param foo "abc"`. - Add `--header-output` and `header-output` options for controlling header output folder. - Generic faults is disallowed. - Detect when a slice on the stack is accidentally returned from a function. ### Fixes - Assert triggered when casting from `int[2]` to `uint[2]` #2115 - Assert when a macro with compile time value is discarded, e.g. `foo();` where `foo()` returns an untyped list. #2117 - Fix stringify for compound initializers #2120. - Fix No index OOB check for `[:^n]` #2123. - Fix regression in Time diff due to operator overloading #2124. - attrdef with any invalid name causes compiler assert #2128. - Correctly error on `@attrdef Foo = ;`. - Contract on trying to use Object without initializing it. - Variable aliases of aliases would not resolve correctly. #2131 - Variable aliases could not be assigned to. - Some folding was missing in binary op compile time resolution #2135. - Defining an enum like `ABC = { 1 2 }` was accidentally allowed. - Using a non-const as the end range for a bitstruct would trigger an assert. - Incorrect parsing of ad hoc generic types, like `Foo{int}****` #2140. - $define did not correctly handle generic types #2140. - Incorrect parsing of call attributes #2144. - Error when using named argument on trailing macro body expansion #2139. - Designated const initializers with `{}` would overwrite the parent field. - Empty default case in @jump switch does not fallthrough #2147. - `&&&` was accidentally available as a valid prefix operator. - Missing error on default values for body with default arguments #2148. - `--path` does not interact correctly with relative path arguments #2149. - Add missing `@noreturn` to `os::exit`. - Implicit casting from struct to interface failure for inheriting interfaces #2151. - Distinct types could not be used with tagof #2152. - `$$sat_mul` was missing. - `for` with incorrect `var` declaration caused crash #2154. - Check pointer/slice/etc on `[out]` and `&` params. #2156. - Compiler didn't check foreach over flexible array member, and folding a flexible array member was allowed #2164. - Too strict project view #2163. - Bug using `#foo` arguments with `$defined` #2173 - Incorrect ensure on String.split. - Removed the naive check for compile time modification, which fixes #1997 but regresses in detection. ### Stdlib changes - Added `String.quick_ztr` and `String.is_zstr` - std::ascii moved into std::core::ascii. Old _m variants are deprecated, as is uint methods. - Add `String.tokenize_all` to replace the now deprecated `String.splitter` - Add `String.count` to count the number of instances of a string. - Add `String.replace` and `String.treplace` to replace substrings within a string. - Add `Duration * Int` and `Clock - Clock` overload. - Add `DateTime + Duration` overloads. - Add `Maybe.equals` and respective `==` operator when the inner type is equatable. - Add `inherit_stdio` option to `SubProcessOptions` to inherit parent's stdin, stdout, and stderr instead of creating pipes. #2012 - Remove superfluous `cleanup` parameter in `os::exit` and `os::fastexit`. - Add `extern fn ioctl(CInt fd, ulong request, ...)` binding to libc; ## 0.7.1 Change list ### Changes / improvements - Better errors on some common casting mistakes (pointer->slice, String->ZString, deref pointer->array) #2064. - Better errors trying to convert an enum to an int and vice versa. - Function `@require` checks are added to the caller in safe mode. #186 - Improved error message when narrowing isn't allowed. - Operator overloading for `+ - * / % & | ^ << >> ~ == != += -= *= /= %= &= |= ^= <<= >>=` - Add `@operator_r` and `@operator_s` attributes. - More stdlib tests: `sincos`, `ArenaAllocator`, `Slice2d`. - Make aliases able to use `@deprecated`. - Refactored stdlib file organization. - Allow `@if` on locals. - String str = "" is now guaranteed to be null terminated. #2083 - Improved error messages on `Foo { 3, abc }` #2099. - `Foo[1..2] = { .baz = 123 }` inference now works. #2095 - Deprecated old inference with slice copy. Copying must now ensure a slicing operator at the end of the right hand side: `foo[1..2] = bar[..]` rather than the old `foo[1..2] = bar`. The old behaviour can be mostly retained with `--use-old-slice-copy`). - Added `Enum.lookup` and `Enum.lookup_field`. - `c3c build` picks first target rather than the first executable #2105. - New Win32 Mutex, ConditionVariable and OnceFlag implementation ### Fixes - Trying to cast an enum to int and back caused the compiler to crash. - Incorrect rounding at compile time going from double to int. - Regression with invalid setup of the WASM temp allocator. - Correctly detect multiple overloads of the same type. - ABI bug on x64 Linux / MacOS when passing a union containing a struct of 3 floats. #2087 - Bug with slice access as inline struct member #2088. - `@if` now does implicit conversion to bool like `$if`. #2086 - Fix broken enum inline -> bool conversions #2094. - `@if` was ignored on attrdef, regression 0.7 #2093. - `@ensure` was not included when the function doesn't return a value #2098. - Added missing `@clone_aligned` and add checks to `@tclone` - Comparing a distinct type with an enum with an inline distinct type failed unexpectedly. - The `%s` would not properly print function pointers. - Compiler crash when passing an untyped list as an argument to `assert` #2108. - `@ensure` should be allowed to read "out" variables. #2107 - Error message for casting generic to incompatible type does not work properly with nested generics #1953 - Fixed enum regression after 0.7.0 enum change. - ConditionVariable now properly works on Win32 ### Stdlib changes - Hash functions for integer vectors and arrays. - Prefer `math::I` and `math::I_F` for `math::IMAGINARY` and `math::IMAGINARYF` the latter is deprecated. - Add `array::contains` to check for a value in an array or slice. ## 0.7.0 Change list ### Changes / improvements - Removed `Foo { 1, 2 }` initializer. - Changed `Foo()` to `Foo {int}`. - Removed `{| |}` expression blocks. - Removed macro `&ref` and `$varef` parameters. - Removed `$vaexpr(0)` syntax in favour of `$vaexpr[0]` - Enum does not cast to/from an integer (its ordinal). - Removed use of `void!` for main, test and benchmark functions. - Removed `$or`, `$and`, `$concat` compile time functions. - Removed `@adhoc` attribute. - Disallow inline use of nested generics (e.g. `List{List{int}}`. - Remove `.allocator = allocator` syntax for functions. - Remove `@operator(construct)`. - Removal of "any-switch". - Allow swizzling assign, eg. `abc.xz += { 5, 10 };` - Added `$$wstr16` and `$$wstr32` builtins. - `$foreach` "()" replaced by trailing ":" `$foreach ($x, $y : $foo)` -> `$foreach $x, $y : $foo:` - `$for` "()" replaced by trailing ":" `$for (var $x = 0; $x < FOO; $x++)` -> `$for var $x = 0; $x < FOO; $x++:` - `$switch` "()" replaced by trailing ":" `$switch ($Type)` -> `$switch $Type:` - Empty `$switch` requires trailing ":" `$switch` -> `$switch:` - Rename `@return!` to `@return?` and change syntax to require ":" after faults. - Remove `if (catch foo) { case ... }` syntax. - Remove `[?]` syntax. - Change `int!` to `int?` syntax. - New `fault` declaration using `faultdef`. - Enum associated values can reference the calling enum. - Improve error message on `foo ?? io::EOF` with missing '?' #2036 - Make `@public` import recursive. #2018 - Fault nameof prefixes the first last module path, for instance `std::io::EOF` is rendered as `io::EOF`. - Rename `def` to `alias`. - Change `distinct` -> `typedef`. - Order of attribute declaration is changed for `alias`. - Added `LANGUAGE_DEV_VERSION` env constant. - Rename `anyfault` -> `fault`. - `!!foo` now works same as as `! ! foo`. - Temp allocator now supports more than 2 in-flight stacks. - Printing stacktrace uses its own temp allocator. - Allow inferred type on body parameters. E.g. `@stack_mem(1024; alloc) { ... };` - Use `@pool_init()` to set up a temp pool on a thread. Only the main thread has implicit temp pool setup. - `tmem` is now a variable. - Compile test and benchmark functions when invoking `--lsp` #2058. - Added `@format` attribute for compile time printf validation #2057. - Formatter no longer implicitly converts enums to ordinals. ### Fixes - Fix address sanitizer to work on MachO targets (e.g. MacOS). - Post and pre-decrement operators switched places for vector elements #2010. - Aliases were incorrectly considered compile time constants. - FreeBSD libc stat definitions were incorrect. - Atomic max was incorrect. - `"+".to_float()` would panic. - `import` can now both be @public and @norecurse. - Crash when trying to convert a struct slice to a vector #2039. - Crash resolving a method on `Foo[2]` when `Foo` is distinct #2042. - Bug due to missing cast when doing `$i[$x] = $z`. - Incorrectly allowed getting pointer to a macro #2049. - &self not runtime null-checked in macro #1827. - Bug when printing a boolean value as an integer using printf. - Show error when a generic module contains a self-generic type. - "Single module" was not enforced when creating a static library using as a project target. ### Stdlib changes - `new_*` functions in general moved to version without `new_` prefix. - `string::new_from_*` changed to `string::from_*`. - `String.to_utf16_copy` and related changed to `String.to_utf16`. - `String.to_utf16_tcopy` and related changed to `String.to_temp_utf16` - `mem::temp_new` changed to `mem::tnew`. - `mem::temp_alloc` and related changed to `mem::talloc`. - `mem::temp_new_array` changed to `mem::temp_array`. - Add `ONHEAP` variants for List/HashMap for initializing global maps on the heap. - Remove Vec2 and other aliases from std::math. Replace `.length_sq()` with `sq_magnitude()` - Change all hash functions to have a common `hash` function. - `@wstring`, `@wstring32`, `@char32` and `@char16` compile time macros added. - Updates to `Atomic` to handle distinct types and booleans. - Added `math::iota`. - `@pool` no longer takes an argument. - `Allocator` interface removes `mark` and `reset`. - DynamicArenaAllocator has changed init function. - Added `BackedArenaAllocator` which is allocated to a fixed size, then allocates on the backing allocator and supports mark/reset. - `AnyList` now also defaults to the temp allocator. - `os::getcwd` and `os::get_home_dir` requires an explicit allocator. - `file::load_new` and `file::load_path_new` removed. - `os::exit` and `os::fastexit` added. ## 0.6.8 Change list ### Changes / improvements - Increase precedence of `(Foo) { 1, 2 }` - Add `--enable-new-generics` to enable `Foo{int}` generic syntax. - `{| |}` expression blocks deprecated. - c3c `--test-leak-report` flag for displaying full memory lead report if any - Output into /.build/obj/ by default. - Output llvm/asm into llvm/ and asm/ by default. - Add flag `--suppress-run`. For commands which may run executable after building, skip the run step. #1931 - Add `--build-env` for build environment information. - Deprecation of `@operator(construct)`. ### Fixes - Bug appearing when `??` was combined with boolean in some cases. - Test runner --test-disable-sort didn't work, c3c was expecting --test-nosort - Test runner with tracking allocator assertion at failed test #1963 - Test runner with tracking allocator didn't properly handle teardown_fn - Correctly give an error if a character literal contains a line break. - Implicitly unwrapped optional value in defer incorrectly copied #1982. - Crash when trying to define a method macro that isn't `@construct` but has no arguments. - Regression, `.gitkeep` files were generated incorrectly. - Aliases are now correctly handled as if they were variables/functions in regards to namespacing and accept `@builtin`. - Correctly handle in/out when interacting with inout. - Don't delete .o files not produced by the compiler. - Fix optional jumps in expression lists, #1942. - Several fixes for .o files and -o output, improving handling and naming. - Fix bug casting bool to int to other int #1995. - `@if` declarations were missing from -P output #1973. - Check exe and lib output so -o works with directories. - Swizzling an inline vector in a struct would cause a crash. - Fixed error and poor error message when using an invalid target name. ### Stdlib changes ## 0.6.7 Change list ### Changes / improvements - Contracts @require/@ensure are no longer treated as conditionals, but must be explicitly bool. - Add `win-debug` setting to be able to pick dwarf for output #1855. - Error on switch case fallthrough if there is more than one newline #1849. - Added flags to `c3c project view` to filter displayed properties - Compile time array assignment #1806. - Allow `+++` to work on all types of arrays. - Allow `(int[*]) { 1, 2 }` cast style initialization. - Experimental change from `[*]` to `[?]` - Warn on if-catch with just a `default` case. - Compile time array inc/dec. - Improve error message when using ',' in struct declarations. #1920 - Compile time array assign ops, e.g. `$c[1] += 3` #1890. - Add `inline` to enums #1819. - Cleaner error message when missing comma in struct initializer #1941. - Distinct inline void causes unexpected error if used in slice #1946. - Allow `fn int test() => @pool() { return 1; }` short function syntax usage #1906. - Test runner will also check for leaks. - Improve inference on `??` #1943. - Detect unaligned loads #1951. - `Thread` no longer allocates memory on posix. ### Fixes - Fix issue requiring prefix on a generic interface declaration. - Fix bug in SHA1 for longer blocks #1854. - Fix lack of location for reporting lambdas with missing return statement #1857. - Compiler allows a generic module to be declared with different parameters #1856. - Fix issue with `@const` where the statement `$foo = 1;` was not considered constant. - Const strings and bytes were not properly converted to compile time bools. - Concatenating a const empty slice with another array caused a null pointer access. - Fix `linux-crt` and `linux-crtbegin` not getting recognized as a project parameter - Fix dues to crash when converting a const vector to another vector #1864. - Filter `$exec` output from `\r`, which otherwise would cause a compiler assert #1867. - Fixes to `"exec" use, including issue when compiling with MinGW. - Correctly check jump table size and be generous when compiling it #1877. - Fix bug where .min/.max would fail on a distinct int #1888. - Fix issue where compile time declarations in expression list would not be handled properly. - Issue where trailing body argument was allowed without type even though the definition specified it #1879. - Fix issues with @jump on empty `default` or only `default` #1893 #1894 - Fixes miscompilation of nested `@jump` #1896. - Fixed STB_WEAK errors when using consts in macros in the stdlib #1871. - Missing error when placing a single statement for-body on a new row #1892. - Fix bug where in dead code, only the first statement would be turned into a nop. - Remove unused $inline argument to mem::copy. - Defer is broken when placed before a $foreach #1912. - Usage of @noreturn macro is type-checked as if it returns #1913. - Bug when indexing into a constant array at compile time. - Fixing various issues around shifts, like `z <<= { 1, 2 }`. - `return (any)&foo` would not be reported as an escaping variable if `foo` was a pointer or slice. - Incorrect error message when providing too many associated values for enum #1934. - Allow function types to have a calling convention. #1938 - Issue with defer copying when triggered by break or continue #1936. - Assert when using optional as init or inc part in a for loop #1942. - Fix bigint hex parsing #1945. - `bigint::from_int(0)` throws assertion #1944. - `write` of qoi would leak memory. - Issue when having an empty `Path` or just "." - `set_env` would leak memory. - Fix issue where aligned bitstructs did not store/load with the given alignment. - Fix issue in GrowableBitSet with sanitizers. - Fix issue in List with sanitizers. - Circumvent Aarch64 miscompilations of atomics. - Fixes to ByteBuffer allocation/free. - Fix issue where compiling both for asm and object file would corrupt the obj file output. - Fix `poll` and `POLL_FOREVER`. - Missing end padding when including a packed struct #1966. - Issue when scalar expanding a boolean from a conditional to a bool vector #1954. - Fix issue when parsing bitstructs, preventing them from implementing interfaces. - Regression `String! a; char* b = a.ptr;` would incorrectly be allowed. - Fix issue where target was ignored for projects. - Fix issue when dereferencing a constant string. - Fix problem where a line break in a literal was allowed. ### Stdlib changes - Added '%h' and '%H' for printing out binary data in hexadecimal using the formatter. - Added weakly linked `__powidf2` - Added channels for threads. - New `std::core::test` module for unit testing machinery. - New unit test default runner. - Added weakly linked `fmodf`. - Add `@select` to perform the equivalent of `a ? x : y` at compile time. - `HashMap` is now `Printable`. - Add `allocator::wrap` to create an arena allocator on the stack from bytes. ## 0.6.6 Change list ### Changes / improvements - Split help into normal and "full" help, #1703 - Removed 'headers' command line option. - Add `enum.from_ordinal` and `fault.from_ordinal` - Deprecate cast-style conversion from integer <-> enum. - Make deprecation an error in test mode. - Add `--win-vs-dirs` to override VS detection dirs. - Add `"name"` project property to override the name of the resulting binary. #1719 - Improved `add-project` to take arguments. - Improve error reporting when using type names as the function argument #1750. - Improve ordering of method registration to support adding methods to generic modules with method constraints #1746 - Support experimental `@operator(construct)` operator overload. - Allow using 'var' to declare lambdas in functions. - Add 'validation' setting and make dead code a warning. - Allow compile time `$foreach` iteration over constant Strings and bytes. - Improved error message when accessing `@private` from other modules #1769. - Include `@name` when searching for possible matches to `name` in the error message. #1779 - Improve `@param` parse errors #1777 - Improved `#foo` resolution inside of the compiler. - Deprecated '&' macro arguments. - Deprecate `fn void! main() type main functions. - Deprecate old `void!` @benchmark and @test functions. - Allow test runners to take String[] arguments. - Added `--lsp` output. - Improve the error message when running out of memory. - Allowed passing arguments to @test / @benchmark runners via `c3c test[benchmark] -- -o --opt1 ` - Handle bytes and string literals the same way in terms of zero termination. - Function comments are stored and displayed with -P. - Prevent `#hash` arguments from taking code that modifies ct variables. #1794 - Make stringify to recursively enter `#hash` expressions #1834. ### Fixes - Fix case trying to initialize a `char[*]*` from a String. - Fix Map & HashMap `put_all_for_create` not copying all elements, causing `init_from_map` to create incomplete copy. - Fix bug when a macro calling an extern function was called in another module also declaring and calling the same function. #1690 - `static-lib` and `dynamic-lib` options from the command line now produces headers. - Fix bug outputting exported functions without predefined extname. - Fix problem where crt1 was linked for dynamic libraries on Linux and BSD. #1710 - Fix CRT detection on Arch Linux. - Fix lexer allowing a trailing underscore (_) with hex and binary literals. - Fix `--list-operators` CLI command printing underscore (_) and hash (#). - Fix bug in temp allocator when temp memory is exhausted and allocation needs overaligned mem. #1715 - Incorrectly handles distinct enums and pointers with '+=' and '-=' #1717. - Prevent DString from being initialized with "". - Fix bug in OnStackAllocator when freeing overallocated data. #1720 - Use `weak_odr` rather than `weak` on Windows which seems to prevent issues such as #1704. - Use `weak` on dyn-symbols on Linux. - Fix crash on project.json not having an empty set of targets. - Miscompile when indexing an array with small unsigned types for enums. - Change CBool to be 1 byte. - `any_to_int` checks value to be int and no longer works with enum. - Add check in formatter printing "%c". - Fix bug where `!!` and `!` was not recognized to jump out of the current scope. - Fix bug when including compile time parameters in trailing body more than once. - Fix issue with compiling a constant struct containing a string array in a local context. - Fix error where panic would not properly stop the program when stacktrace couldn't be printed #1751. - Macros with default arguments to `&`, `#` and type parameters didn't work as expected. #1754. - `net::poll()` with negative timeout behaved incorrectly. - Return type inference bugs with macros #1757 - `$defined` in a global scope should accept testing normal macros. - Assert on add to uninitialized ct variable #1765. - Dynamic function lookup fails after changing type without dummy anycast #1761 - $vasplat was allowed inside of a function when passed as an argument to a function. - Prohibit raw vaargs in regular functions with a function body. - Assert on certain slice to slice casts. #1768. - Fix vector float -> bool conversion. - Fix `+a = 1` erroneously being accepted. - Fix not freeing a zero length String - Macros with trailing bodys aren't allowed as the single statement after a while loop with no body #1772. - Deref subscripts as needed for macro ref method arguments. #1789 - Change ordering to simplify adding methods to type in conditional modules. - `#foo` style arguments were not type checked when given a type. #1790 - Bug when using +++ on value build a slice or array: the rhs cast was not done. - Fix bug preventing compile time slices from being iterated over with `$foreach`. - Fix bug with defer assignment in macro #1807. - Fix regression with swizzle references for vectors #1810. - Assert when partially initializing a constant struct containing a slice #1812. - Assert concatenating constant slices #1805. - Do not link "ld" on Linux with no libc. - Fix bug when multiple `$else` clauses followed an `$if` #1824. - Report the correct type as not having a method when access fails #1828. - Prevent temp arena scribbling from causing an asan warning. #1825 - Fix bug where `&i[0] = null` was not detected to be an error #1833. ### Stdlib changes - Increase BitWriter.write_bits limit up to 32 bits. - Updates to `Slice2d`, like `get_xy` and others. - Added `iter()` `value_iter()` and `key_iter()` to HashMap. - Add "tokenizer" to String. - Add "skip_empty" to split methods. Add split_to_buffer method. - Add `@enum_from_value`. - Updated hash function. - Added URL parser. - Added convenience functions to `Maybe`. - Added `String.trim_left()` and `.trim_right()`. - Deprecation of several `&` macros. - Format functions for timedates. - Add `@assert_leak()` to assert on memory leaks in the scope. - Added `double.set_high_word()`, `double.set_low_word()`, and `float.set_word()`. ## 0.6.5 Change list ### Changes / improvements - Allow splat in initializers. - Init command will now add `test-sources` to `project.json` #1520 - `a++` may be discarded if `a` is optional and ++/-- works for overloaded operators. - Improve support for Windows cross compilation on targets with case sensitive file systems. - Add "sources" support to library `manifest.json`, defaults to root folder if unspecified. - Add char_at method in DString and operators [], len, []= and &[]. - Add `-q` option, make `--run-once` implicitly `-q`. - Add `-v`, `-vv` and `-vvv` options for increasing verbosity, replacing debug-log and debug-stats options. ### Fixes - Fix bug where `a > 0 ? f() : g()` could cause a compiler crash if both returned `void!`. - `@builtin` was not respected for generic modules #1617. - Fix issue writing a single byte in the WriteBuffer - A distinct inline pointer type can now participate in pointer arithmetics. - Support &a[0] returning the distinct type when applying it to a distinct of a pointer. - Fix error when calling `HashMap.remove` on uninitialized `HashMap`. - Fix issue with resolved try-unwrap in defer. - Fix issue with overloaded subscript and ++/-- and assign ops (e.g. `*=`) - Fix issue with properties in different targets not being respected #1633. - Indexing an Optional slice would crash in codegen #1636. - SimpleHeapAllocator bug when splitting blocks allowed memory overrun. - Not possible to alias or take reference for extension methods on non-user defined types. #1637 - Prevent methods from using names of properties or fields. #1638 - b64 / hex data strings can now be used with \` as well. - Contracts on generic modules would evaluate too late, sometimes not catching the error until it already occurred elsewhere. - Fix bug preventing optionals from being used in ranges or as indices. - Crash compiling for arm64 when returning 16 byte and smaller structs by value not a power of 2 #1649. - Enforce single module compilation for static libraries to make constructors run properly. - Crash when using --no-obj without compile-only. #1653 - Do not produce expression locations for windows. - Issue where multiple methods were accepted for the same type. - Issue where a method was linked to a type alias instead of the underlying type. - Fix Fnv1a encoding. - Fix issue with accessing arrays in access-overloaded types, e.g. `list[1][2]` #1665. - Cast removing arbitrary array indices and converting them to pointers should always be fine #1664 - Incorrect "no-libc" definition of `cos`, making it unavailable for wasm. - Fix issue with the adjoint and inverse calculations for `Matrix2x2`. - It was possible to create 0 length arrays using byte literals. #1678 - Crash when a constant null typeid is checked for properties. #1679 ### Stdlib changes - Add `io::MultiReader`, `io::MultiWriter`, and `io::TeeReader` structs. - Updated Base32 API. - Add `file::save`. - Add `memcpy` / `memset` / `memcmp` to nolibc. - Add `sort::quickselect` to find the k-th smallest element in an unordered list. - Add `sort::is_sorted` to determine if a list is sorted. - Implement RFC 3986 for url encoding and decoding. ## 0.6.4 Change list ### Changes / improvements - Const vector -> const slice implicit conversion. - Slicing arrays, slices and bytes at compile time #1466. - Better error for `int a[4] = ...`. #1518 - Better error for `int Foo(int a)` declarations #1516 - Improve error message in the case of `MyInterface x = foo;` #1522 - Deprecate `@adhoc`, allow non-nested ad hoc generic types. - Constant bytes <=> char[] conversion should work #1514. - Infer now works across ternary. - Interfaces now support .ptr and .type directly without casting to `any`. - Switch to `<* *>` docs. - Improve error messages on expressions like `var $type = int;` #1553. - Disallow casting a `void*` to `any` or an interface, unless it is `null`. - Defer resolution of declarations when looked up in `def` aliased #1559. - Adding constants to the Json AST #1540 - Adding info to the globals inside Json AST #1541 - Null-check function pointer invocation #1573. - `string::new_struct_to_str` and `io::struct_to_format` to dump struct data. - `io::print` will now print structs. - Improve error message when using `void` aliases as variable storage type. - Add a target type: "prepare" which doesn't compile anything (but may run `exec`) - Improve error message on incorrect inner struct/union name #1847. ### Fixes - `Unsupported int[*] $x = { 1, 2, 3, 4 }` #1489. - Unexpected compile error using a typed constant with `copysign` #1517 - Incorrect subscript resolution #1519. - Segfault with passing a program with `-` using stdin. - Using no module with `-` would reject the program. - Unintended deref of pointers with methods caused regression with hash function. - Fix broken sincos function. - Bug when a continue is copied in a defer. - Compiler error when any/interface initialized using {} #1533. - Bug when defers and $if were combined in a macro, which would cause miscompilation. - Fixes to the CSV reader. - Crash returning struct or vector from function using ternary expression #1537. - Improved error message on invalid subscript index type #1535. - Improved error message when declaring a variable `void!`. - Cannot use void as a generic parameter #1546 - Interfaces not correctly copied with generics #1545 - Memory leak in keys.new_list fixed. - Standard library is now correctly weakly linked, fixing the use of C3 .so together with executable. #1549, #1107. - Wrong error message for interface methods with body #1536. - Empty expression block would crash compiler with debug on #1554. - Improve infer conversions on constants, e.g. `ZString a = foo ? "a" : "b";` #1561 - Show error when declarations do not start with `fn` in interfaces. #1565 - `if (try foo)` was handled incorrectly inside a defer. - `&self` argument not implicitly null checked. #1556. - `(uptr)&((Foo*)null).a` incorrectly inserts a null check. #1544 - Incorrect error message when `$eval` is provided an invalid string. #1570 - `HashMap.copy_keys` did not properly copy keys which needed to be allocated #1569 - Named vector component access would not fold at compile time. #1574 - `$define` would occasionally not properly evaluate declarations it encountered. - Fixes with error handling recursive `@tag` #1583. - Sometimes generating introspection info would not be in the global scope causing a crash #1586. - @tag on macros cannot be retrieved with tagof #1582 - Taking the $typeof of a wildcard optional returns `void!`. - Fix bug with enums with jump tables #1840. - Enum associated declarations accidentally allowed declaration in function style. #1841 - Quicksort and insertsort incorrectly allowing arrays and vectors by value. #1845. ### Stdlib changes - Remove unintended print of `char[]` as String - Add read/write to stream with big endian ints. - Move accidently hidden "wrap_bytes". - Added CBool #1530. - Added encoding/base32 module. ## 0.6.3 Change list ### Changes / improvements - Introduce `arg: x` named arguments instead of `.arg = x`, deprecate old style. - Support splat for varargs #1352. - Allow `var` in lambdas in macros. - Support `int[*] { 1, 2, 3 }` expressions. - Support inline struct designated init as if inline was anonymous. - Introduce the `.paramsof` property. - Support environment variable 'C3C_LIB' to find the standard library. - Support environment variable 'C3C_CC' to find the default C compiler. - Support casting bitstructs to bool. - Allow user-defined attributes to have typed parameters. - Add `.gitkeep` files to project subfolders. - Add `env::COMPILER_BUILD_HASH` and `env::COMPILER_BUILD_DATE` - Support linking .o files in compilation command. #1417 - Slicing constant strings at compile time works. - Add `project fetch` subcommand to fetch missing project dependencies (general and target specific) - Ability of `vendor-fetch` to download the dependencies in the first specified path `dependencies-search-path` - Ability of `vendor-fetch` to register the fetched dependencies in the project file. - Allow the "self" parameter to be $/# for macro methods. - Support compile time slicing of untyped lists. - Allow specifying an import module using `@wasm` #1305. - Deprecated inline generic types outside of struct definitions and macros unless marked `@adhoc`. - Improved method detection in earlier stages of checking. - Allow `@norecurse` attribute for non-recursive imports #1480. - wasm32 / wasm64 targets are use-libc=no by default. - Add hash/sha256 module ### Fixes - Issue where a lambda wasn't correctly registered as external. #1408 - Generic methods were incorrectly registered as functions, leading to naming collisions. #1402 - Deprecated tuple / triple types. - Converting a slice to a vector/array would copy too little data. - Crash when reading an empty 'manifest.json'. - "optsize" did not work correctly in project.json. - `l[0].a = 1` now supported for overloads due to better lvalue handling #1357. - Asserts are retained regardless of optimization when running tests. - Limit object filename lengths. #1415 - Fix regression for `$include`. - Correct '.so' suffix on dynamic libraries on Linux. - Fix bug where inline index access to array in a struct would crash the compiler. - Asserts are now correctly included and traced in when running tests. - Use atexit to fix finalizers on Windows #1361. - Fix bugs in "trap-on-wrap" #1434. - Bug with casting anyfault to error. - Lambda / function type would accidentally be processed as a method. - Fix error message when not finding a particular function. - Crash invoking a `@body` argument with the wrong number of parameters. - Fix reordering semantics in struct assignment. - Regression when passing types as `#expr` arguments. #1461 - Temp allocator overwrites data when doing reset on extra allocated pages. #1462 - User defined attributes could not have more than 1 parameter due to bug. - Folding a constant array of structs at compile time would cause an assert. - Enum attributes would be overwritten by enum value attributes. - LLVM issue with try when bool is combined #1467. - Segfault using ternary with no assignment #1468. - Inner types make some errors misleading #1471. - Fix bug when passing a type as a compile time value. - Fix bug due to enum associated values not being checked for liveness. - Regression when compile time accessing a union field not last assigned to. - Safer seed of rand() for WASM without libc. - Bad error message aliasing an ident with a path. #1481. - Error when slicing a struct with an inline array #1488. - Improved error messages on `Foo a = foo { 1 };` #1496 - Bug in json decoder escape handling. - Fix bug when reading zip manifest, that would not return a zero terminated string. #1490 - Fix thread tests. - Detect recursion errors on non-recursive mutexes in safe mode. - Foreach over distinct pointer failed to be caught as error #1506. - Foreach over distinct iterable would ignore operator(len). - Compiler crash when compiling c code in a library without --obj-out #1503. ### Stdlib changes - Additional init functions for hashmap. - `format` functions are now functions and work better with splat. - Add support for the QOI format. - Add `io::read_new_fully` for reading to the end of a stream. - Add `io::wrap_bytes` for reading bytes with `io` functions. - Add `rnd` and `rand_in_range` default random functions. - Additional timezone related functions for `datetime`. - Added MD5 and crypto::safe_compare. - Added generic HMAC. - Added generic PBKDF2 implementation. - DString `reverse`. - `DString.insert_at` now has variants for other types. ## 0.6.2 Change list ### Changes / improvements - Updated LLVM passes - Added `is_substruct` type property. - Scalar -> vector not implicit in call or assign. - Added `--vector-conv` to enable the old scalar->vector conversion behaviour. - Added "weak" type aliases `def Foo = my_foo::Foo @weak;` - `*-add` keys in targets in `manifest.json` and `project.json` are deprecated. - Made "add" the default for things like `sources`, `dependencies` and other keys in project and library files. - Give some symbol name suggestions when the path is matched. - Don't generate .o files on `compile` and `compile-run` if there is no `main`. - c3c init-lib does not create the directory with the .c3l suffix #1253 - Permit foreach values to be optional. - Add `--show-backtrace` option to disable backtrace for even smaller binary. - Untested Xtensa support. - && doesn't work correctly with lambdas #1279. - Fix incorrect override of optimization levels when using projects. - Add experimental `@noalias` attribute. - Add a `--run-once` option to delete the output file after running it. - Add `@const` attribute for macros, for better error messages with constant macros. - Add `wincrt` setting to libraries. - Add `+++` `&&&` `|||` as replacement for `$concat`, `$and` and `$or`. - Add `methodsof` to type info for struct, union and bitstruct. - Added `@tag` `tagof` and `has_tagof` to user defined types and members. - Added `c-include-dirs` project/manifest setting. - The compiler now skips UTF8 BOM. - Printable values passed to the Formatter as pointers, will print as if passed by value. - Pointers are rendered with "0x" prefix when passed to '%s'. - Add temp allocator scribble. - Use PIC by default on Linux. - `$exec` may now provide a stdin parameter. - Introduce `$vaarg[...]` syntax and deprecate the old `$vaarg(...)`. - Similar change to `$vasplat`: `$vasplat` and `$vasplat[1..]`. - Add `$member.get(value)` to replace `value.$eval($member.nameof)` - Improve the error message when the compilation does not produce any files #1390. - Add `fmod` implementation for nolibc. - Allow `(Foo) { 1, 2 }` syntax for compound literals. ### Fixes - Broken WASM library code. - Regression: Invalid is_random implementation due to changes in 0.6. - `dbghelp.lib` was linked even on nolibc on Windows. - Fix incorrect linker selection on some platforms. - Struct members declared in a single line declaration were not sharing attributes. #1266 - `opt` project setting now properly documented. - Incorrect justify formatting of integers. - Assertion with duplicate function pointer signatures #1286 - Distinct func type would not accept direct function address assign. #1287 - Distinct inline would not implement protocol if the inlined implemented it. #1292 - Distinct inline can now be called if it is aliasing a function pointer. - Bug in List add_array when reserving memory. - Fix issue where a compile time parameter is followed by "...". - Fix issue with some conversions to untyped list. - Issue where a `if (catch e = ...)` in a defer would be incorrectly copied. Causing codegen error. - Variable in if-try / if-catch cannot be a reused variable name. - Vararg interfaces were broken. - LLVM codegen for constants in enums could fail. - Fixes to the socket functions. - Improved output when pointer is out of range. - Better error when casting to a distinct fails. - With single module, name the .o file after what `-o` provides. #1306 - Bitstruct members can now have attributes. - `%` analysis was incorrect for int vectors. - When resolving inherited interfaces, the interface type wasn't always resolved. - Fix issues when checking methods and interfaces hasn't been resolved yet. - Fix Vec2.angle - Update to libc::setjmp on Win32, to do no stack unwinding. - Recursively follow interfaces when looking up method. - Int128 alignment change in LLVM fixed on x64. - Fix interface lazy resolution errors. - Interface resolution when part of generics #1348. - Assert not properly traced #1354. - Ordering issues with `$include` / `$exec` fixed #1302. - Issues with wincrt linking. - Debug info with recursive canonical type usage could cause segfault. - Missing check on optional left hand side for `s.x`. - Incorrect zero analysis on `foo["test"] = {}` #1360. - Bug converting untyped list #1360. - Benchmark / test no longer suppresses debug info. #1364. - Bug when compile time subtracting a distinct type. - `insert_at` incorrectly prevented inserts at the end of a list. - Fix aligned alloc for Win32 targets. - Compiler didn't detect when a module name was used both as a generic and regular module. - Assigning a const zero to an aliased distinct caused an error. - `--path` is now properly respected. - `--test` will now provide the full filename and the column. - Fix of bug in `defer (catch err)` with a direct return error. - Too restrictive compile time checks for @const. - Fixes to wasm nolibc in the standard library. - Fixed int128 div/mod. - Fix WASM memory init priority. - Fix bug with `defer (catch err)` when used together with regular defer. - Methods can now properly be aliased using `def` #1393. - Memory leak in Object when not using temp allocators. - Tracking allocator would double the allocations in the report. - `printf` will now show errors in the output when there are errors. - Bug where `if try` would work incorrectly in a macro. - Prevent loading / storing large structs with LLVM. ### Stdlib changes - `send` and `recv` added to `libc` for Posix / Win32. - Add support to destroy temp allocators. - Deprecated `path.append`, `path.tappend`, `getcwd`, `tgetcwd`, `path.absolute`, `ls`. - Deprecated `env::get_config_dir`, replaced by `env::new_get_config_dir`. - Added `path.has_extension`, `path.new_append`, `path.temp_append`, `new_cwd`, `temp_cwd`, `path.new_absolute`, `new_ls`, `temp_ls`. - Added `dstring.replace` - New hashmap type, `Map` - Added `ElasticArray`. - Added `types::is_signed`, `types::is_unsigned` and `types::inner_type`. ## 0.6.1 Change list ### Changes / improvements - Addition of $append and $concat functions. - Added $$str_hash, $$str_upper, $$str_lower, $$str_find builtins. - Improved error notes when call expressions have errors. - Trailing body arguments may now be `&ref`, `#hash`, `$const` and `$Type` arguments. - "panic-msg" setting to suppress panic message output. - Require `@export` functions to have `@export` types. - Disallow leading/trailing/duplicate '_' in module names. - Updated mangling. - Added `$$unaligned_load` and `$$unaligned_store`. - `--no-headers` option to suppress creating headers when generating a library. - Support c-file compilation in libraries. - Allow using $defined(&a[1]) to check if the operation is supported. - Max number of members in a struct is limited to 65535. - The maximum number of parameters in a call is now 255, up from 127. - Array comparison now uses built-in memcmp on LLVM to enable optimizations. - Prevent implicit array casts to pointers with higher alignment #1237. - Macro `$case` statements now pick the first match and does not evaluate the rest. - `manifest.json` is now checked for incorrect keys. - Added `--list-manifest-properties` to list the available properties in `manifest.json`. - Indexing into a constant array / struct now works at compile time. - Improved error message when trying user foreach with an untyped list. - RISCV asm support. ### Fixes - Error with unsigned compare in `@ensure` when early returning 0 #1207. - Prevent Mach-O from removing `@init` and `@dynamic` in a more reliable way #1200. - Fix of missing copy of parameterized custom attributes. - Fixed crash on certain recursive function definitions #1209. - Return the typekind "FUNC" for a function pointer. - No longer possible to dereference a function pointer. - Fix bug with @jump miscompile. - Bit negate does implicit integer promotion. - Bitstructs, unions and flexible arrays now correctly emitted in headers. - Fix distinct inline conversions. - Bit negating const zero flags would give an incorrect result. - Fix to scalar -> vector conversions. - Bug fix for rethrow + defer catch. - Wrong size for structs containing overaligned structs #1219 - $typeof(*x) should be valid when x is an `[out]` parameter #1226 - Fix ABI lowering for 128 bit vectors on Linux. - Bad error message when using a generic method without generic parameters #1228 - Private function called from nested macro not visible to linker #1232 - Bitstructs in structs would not be correctly be handled in some cases. - Fix problem where a $$FUNC would return "" when evaluated for a static in a function #1236. - `ordinal` is no longer a valid associated value name for enums. - Constants defined by indexing into another constant could fail codegen. - Stdlib nolibc code bugs fixed. - Regression: duplicate symbols with static variable declared in macro #1248. - Unsplat with named parameters was accidentally disallowed. - Reference parameter doesn't work with vector subscript #1250. - The msvc_sdk script failed to work properly on windows when run in folders with spaces. - Using winmain would call the wrong definition #1265. - DynamicArenaAllocator would not correctly free. ### Stdlib changes - Added `remove_first_item` `remove_last_item` and `remove_item` as aliases for the `match` functions. - Added @str_hash, @str_upper, @str_lower, @str_find compile time macros. - Remove "panic" text from unreachable() when safe mode is turned off. - Added `@unaligned_store` and `@unaligned_load`. - Null ZString, DString or pointer prints "(null)" for printf. - Updated sorting API. - Insertion sort and counting sort added. - Added missing `mem` and `mem::allocator` functions for aligned allocations. - Added `new_init_with_array` and `temp_init_with_array` for List. - Fixed posix `NativeMutex.lock_timeout`. - Fixed `env::ARCH_32_BIT` and `env::ARCH_64_BIT`. - Added `time::us`. ## 0.6.0 Change list ### Changes / improvements - `@default` implementations for interfaces removed. - `any*` => `any`, same for interfaces. - Private / local globals now have `internal` visibility in LLVM. - Updated enum syntax. - 'rgba' also available for swizzling. - The name "subarray" has been replaced by the more well known name "slice' across the codebase. - Improved alignment handling. - Add `--output-dir` to command line. #1155 - Allow making distinct types out of "void", "typeid", "anyfault" and faults. - Removed `--system-linker` setting. - "Try" expressions may not be any binary or unary expressions. So for example `try foo() + 1` is disallowed. - Added `$$REGISTER_SIZE` for int register size. - `assert(false)` only allowed in unused branches or in tests. Compile time failed asserts is a compile time error. - Require expression blocks returning values to have the value used. - Detect "unsigned >= 0" as errors. - Improve callstack debug information #1184. - Request jump table using @jump for switches. - Improved inline debug information. - Improved error messages on inlined macros. - Introduce MSVC compatible SIMD ABI. - `$foreach` doesn't create an implicit syntactic scope. - Error of `@if` depends on `@if` - Support `defer (catch err)` - Added `print-input` command argument to print all files used for compilation - Allow recursive function definitions as long as they are pointers. #1182 - Default CPU to native if less than AVX, otherwise use AVX. - Bounds checking on length for `foo[1:2]` slicing #1191. - Foreach uses non-wrapping add/dec. ### Fixes - Fixed issue in safe mode when converting enums. - Better checking of operator methods. - Bug when assigning an optional from an optional. - Lambdas were not type checked thoroughly #1185. - Fix problems using reflection on interface types #1203. - `@param` with unnamed macro varargs could crash the compiler. - Compiler crash using enum nameof from different module #1205. - Incorrect length passed to scratch buffer printf. - Casting to a bitstruct would be allowed even if the type was the wrong size. - Generic modules parameterized with constants would sometimes get the wrong parameterized module name causing conversion errors #1192. - Duplicate emit of expressions on negation would incorrectly compile negated macros. - Casting a slice address to its pointer type should not compile #1193. - Union is not properly zero-initialized with designated initializer #1194. - Compile time fmod evaluates to 0 #1195. - Assertion failed when casting (unsigned) argument to enum #1196 - Correct debug info on parameters without storage. - Fix location on foreach debug output. - Compiler crash on designated initializer for structs with bitstruct. ### Stdlib changes - "init_new/init_temp" removed. - LinkedList API rewritten. - List "pop" and "remove" function now return Optionals. - RingBuffer API rewritten. Allocator interface changed. - Deprecated Allocator, DString and mem functions removed. - "identity" functions are now constants for Matrix and Complex numbers. - Removed 'append' from Object and List, replaced by 'push'. - `GenericList` renamed `AnyList`. - Proper handling of '.' and Win32 '//server' paths. - Path normalization - fix possible null terminator out of bounds. - Add 'zstr' variants for `string::new_format` / `string::tformat`. - Fix mutex and wait signatures for Win32. ## 0.5.5 Change list ### Changes / improvements - Disallow multiple `_` in a row in digits, e.g. `1__000`. - Added `@link` attribute. - New 'linker' build option. - "linker" project setting updated, "system-linker" removed. ### Fixes - Struct/union members now correctly rejects members without storage size #1147. - `math::pow` will now correctly promote integer arguments. - Pointer difference would fail where alignment != size (structs etc) #1150 - Fixed array calculation for npot2 vectors. - $$memcpy_inline and $$memset_inline fixed. - `.$Type = ...` and `.$foo = ...` now works #1156. - `int.min` incorrect behaviour #1154. - Bitstruct cast to other bitstruct by way of underlying type would fail #1159. - Bug in `time.add_seconds` #1162. - Remove initial './' in Win32 and convert '/' to '\' for paths when running a binary. - 'output' directory for projects was incorrect in templates. - Regression: no stacktrace. - For MacOS, running with higher optimization would crash as initializers were removed. - `compile-run` and `run` now returns the proper return code. - Allow String constants -> ichar*, and allow integer pointers to explicitly convert between unsigned signed. - Bug in unaligned return value lowering for Aarch64. ### Stdlib changes - Added `new_aligned` and `alloc_aligned` functions to prevent accidental under-alignment when allocating simd. - Fixes to realloc of aligned allocations - Use native Windows calls on aligned allocations on Windows. - mem::copy_inline, mem::clear_inline and mem::set_inline added. - mem::copy / clear / set no longer has an `$inline` attribute. - Native aligned libc malloc on Windows & POSIX. - Simplification of the allocator interface. - CoreFoundation only linked on MacOS when used. ## 0.5.4 Change list ### Changes / improvements - Hash variables may now take a designated initializer. - Added @safemacro to override the `@` requirement for non-function-like macros. - More information available with debug log in non debug builds. - Removed install_win_reqs.bat which didn't work well. - Support `**` to mean `./**` - MacOS init/finalizer now respects priority. - Bitstructs supports `!=` and `==`. - Support Windows `.def` files using `--windef`. - Bitstructs now fold compile time constant bit ops. - Fix issue where in some cases a constant global with a string wasn't folded (e.g. in asm stmts) - Lateral implicit imports removed. - Default to '.' if no libdir is specified. - Improved error messages for `--lib`. - Added `--linker` to set the linker #1067. ### Fixes - Fixes to macro context evaluation with macro varargs. - Dynamic methods registered before init functions on MacOS. - Fixed clobber on x86 `cpuid` instruction. - Removed invalid syntax from grammar.y. - `output` project setting now respected. - Aliased declarations caused errors when used in initializers. - Aliased consts used as constant initializers caused errors. - Exported module names replace `::` by `_`. - Const ternary would evaluate incorrectly for ?: - `$$MODULE` would report the incorrect module name in macros. - Fixed debug info for globals and for/switch scopes. - `out` now correctly detects subscript[] use. - Ambiguous recursive imports are now correctly detected. - Overzealous local escape check corrected #1127. - Fixes to the matrix functions #1130. ### Stdlib changes - Deprecated `Allocator` helper functions. - Added `mem::allocator` functions corresponding to removed allocator functions. - Changed `mem::new` / `mem::temp_new` to accept an optional initializer, and will clear by default. - Mem `_clear` and `_zero` variants deprecated. "new_*" functions will clear by default. - Mem "alloc_*" functions replace old "new_*" behaviour. - Fixed temp memory issue with formatter. - Added temp_push and temp_pop for pushing / popping the temp allocator manually (or from C). - Added byte_size to `List` - Added `GenericList`. ## 0.5.3 Change list ### Changes / improvements - Migrate from using actual type with GEP, use i8 or i8 array instead. - Optimize foreach for single element arrays. - Move all calls to panic due to checks to the end of the function. ### Fixes - Single module command line option was not respected. - Fixed issue with compile time defined types (String in this case), which would crash the compiler in certain cases. - Projects now correctly respect optimization directives. - Generic modules now correctly follow the implicit import rules of regular modules. - Passing an untyped list to a macro and then using it as a vaarg would crash the compiler. - Extern const globals now work correctly. ### Stdlib changes - init_new/init_temp deprecated, replaced by new_init and temp_init. ## 0.5.2 Change list ### Changes / improvements - Allow trailing comma in calls and parameters #1092. ### Fixes - Fixes issue where single character filenames like 'a.c3' would be rejected. - Better errors when index type doesn't match len() when doing user defined foreach. - Fixes to `to_int` for hexadecimal strings. - Fixed issue when using a generic type from a generic type. - Bug with vector parameters when the size > 2 and modified. - Missing error on assigning to in-parameters through subscripting. - Inference of a vector on the lhs of a binary expression would cause a crash. - Fixes to PriorityQueue ### Stdlib changes - Allow `to_int` family functions take a base, parsing base 2-10 and 16. ## 0.5.1 Change list ### Changes / improvements - Improved error messages for const errors. - Do not link with debug libraries unless using static libraries. - Add 'print-linking' build option. - System linker may be used even if the target arch is different from current. - Slice -> array/vector works for constant slice lengths. ### Fixes - On Aarch64 use the correct frame pointer type. - On Aarch64 macOS, ensure the minimum version is 11.0 (Big Sur) - Fixes to the yacc grammar. - Dsym generation on macOS will correctly emit -arch. - Stacktrace on signals on Linux when backtrace is available. ### Stdlib changes - `delete` and `delete_range` added to DString. - `Splitter` iterator added. - `splitter` and `iterator` String methods. - `load_new`, `load_buffer` and `load_temp` std::io::file functions. ## 0.5.0 Change List ### Changes / improvements - Trackable allocator with leak allocation backtraces. - `$defined` can take a list of expressions. - `$and` compile time "and" which does not check expressions after the first is an error. - `$is_const` returns true if an expression is compile time const. - `$assignable` returns true is an expression may be implicitly cast to a type. - `$checks` and `@checked` removed, replaced by an improved `$defined` - Asm string blocks use AT&T syntax for better reliability. - Distinct methods changed to separate syntax. - 'exec' directive to run scripts at compile time. - Project key descriptions in --list command. - Added `init-lib` to simplify library creation. - Local `const` work like namespaced global `const`. - Added `$$atomic_fetch_*` builtins. - vectors may now contain pointers. - `void!` does not convert to `anyfault`. - `$$masked_load` / `$$masked_store` / `$$gather` / `$$scatter` for vector masked load/store. - `$$select` builtin for vector masked select. - Added builtin benchmarks by `benchmark`, `compile-benchmark` commands and `@benchmark` attribute. - Subtype matching in type switches. - Added parentof typeid property. - Slice assignment is expanded. - Enforced optional handling. - Better dead code analysis, and added dead code errors. - Exhaustive switches with enums has better analysis. - Globals may now be initialized with optional values. - New generic syntax. - Slice initialization. - `$feature` for feature flags. - Native stacktrace for Linux, MacOS and Windows. - Macro ref parameters are now of pointer type and ref parameters are not assignable. - Added `nextcase default`. - Added `$embed` to embed binary data. - Ad hoc generics are now allowed. - Allow inferred type on method first argument. - Fix to void expression blocks - Temporary objects may now invoke methods using ref parameters. - Delete object files after successful linking. - Compile time subscript of constant strings and bytes. - `@if` introduced, other top level conditional compilation removed. - Dynamically dispatched interfaces with optional methods. - `$if` now uses `$if :` syntax. - `$assert` now uses `$assert : ` - `$error` is syntax sugar for `$assert false : "Some message"` - `$include`, `$echo` no longer has mandatory `()` around the arguments. - `$exec` for including the output of files. - `assert` no longer allows "try unwrap" - Updated cpu arguments for x86 - Removed support for ranged case statements that were floats or enums, or non-constant. - `nextcase` with a constant expression that does not match any case is an error. - Dropped support for LLVM 13-14. - Updated grammar and lexer definition. - Removal of `$elif`. - any / anyfault may now be aliased. - `@stdcall` etc removed in favor of `@callconv` - Empty fault definitions is now an error. - Better errors on incorrect bitstruct syntax. - Internal use wildcard type rather than optional wildcard. - Experimental scaled vector type removed. - Disallow parameterize attributes without parameters eg `define @Foo() = { @inline }`. - Handle `@optreturn` contract, renamed `@return!`. - Restrict interface style functions. - Optional propagation and assignment '!' and '?' are flipped. - Add `l` suffix (alias for i64). - Allow getting the underlying type of anyfault. - De-duplicate string constants. - Change @extname => @extern. - `define` and `typedef` removed. - `define` is replaced by `def`. - LLVM "wrapper" library compilation is exception free. - `private` is replaced by attribute `@private`. - Addition of `@local` for file local visibility. - Addition of `@public` for overriding default visibility. - Default visibility can be overridden per module compile unit. Eg `module foo @private`. - Optimized macro codegen for -O0. - Addition of unary `+`. - Remove possibility to elide length when using ':' for slices. - Remove the `:` and `;` used in $if, $switch etc. - Faults have an ordinal. - Generic module contracts. - Type inference on enum comparisons, e.g `foo_enum == ABC`. - Allow {} to initialize basic types. - String literals default to `String`. - More const modification detection. - C3L zip support. - Support printing object files. - Downloading of libraries using vendor "fetch". - Structural casts removed. - Added "native" option for vector capability. - `$$shufflevector` replaced with `$$swizzle` and `$$swizzle2`. - Builtin swizzle accessors. - Lambdas, e.g `a = int(x, y) => x + y`. - $$FILEPATH builtin constant. - `variant` renamed `any`. - `anyerr` renamed `anyfault`. - Added `$$wasm_memory_size` and `$$wasm_memory_grow` builtins. - Add "link-args" for project. - Possible to suppress entry points using `--no-entry`. - Added `memory-env` option. - Use the .wasm extension on WASM binaries. - Update precedence clarification rules for ^|&. - Support for casting any expression to `void`. - Win 32-bit processor target removed. - Insert null-check for contracts declaring & params. - Support user defined attributes in generic modules. - `--strip-unused` directive for small binaries. - `$$atomic_store` and `$$atomic_load` added. - `usz`/`isz` replaces `usize` and `isize`. - `@export` attribute to determine what is visible in precompiled libraries. - Disallow obviously wrong code returning a pointer to a stack variable. - Add &^| operations for bitstructs. - `@noinit` replaces `= void` to opt-out of implicit zeroing. - Multiple declarations are now allowed in most places, eg `int a, b;`. - Allow simplified (boolean) bitstruct definitions. - Allow `@test` to be placed on module declarations. - Updated name mangling for non-exports. - `defer catch` and `defer try` statements added. - Better errors from `$assert`. - `@deprecated` attribute added. - Allow complex array length inference, eg `int[*][2][*] a = ...`. - Cleanup of cast code. - Removal of `generic` keyword. - Remove implicit cast enum <-> int. - Allow enums to use a distinct type as the backing type. - Update addition and subtraction on enums. - `@ensure` checks only non-optional results. - `assert` may now take varargs for formatting. ### Stdlib changes - Tracking allocator with location. - `init_new`/`init_temp` for allocating init methods. - `DString.printf` is now `DString.appendf`. - Tuple and Maybe types. - `.as_str()` replaced by `.str_view()` - Added `math::log(x , base)` and `math::ln(x)`. - Hashmap keys implicitly copied if copy/free are defined. - Socket handling. - `csv` package. - Many random functions. - Updated posix/win32 stdlib namespacing - `process` stdlib - Stdlib updates to string. - Many additions to `List`: `remove`, `array_view`, `add_all`, `compact` etc - Added dstringwriter. - Improved printf formatting. - is_finite/is_nam/is_inf added. - OnStack allocator to easily allocate a stack buffer. - File enhancements: mkdir, rmdir, chdir. - Path type for file path handling. - Distinct `String` type. - VarString replaced by DString. - Removal of std::core::str. - JSON parser and general Object type. - Addition of `EnumMap`. - RC4 crypto. - Matrix identity macros. - compare_exchange added. - `printfln` and `println` renamed `printfn` and `printn`. - Support of roundeven. - Added easings. - Updated complex/matrix, added quaternion maths. - Improved support for freestanding. - Improved windows main support, with @winmain annotations. - `SimpleHeapAllocator` added. - Added win32 standard types. - Added `saturated` math. - Added `@expect`, `@unlikely` and `@likely` macros. - Temp allocator uses memory-env to determine starting size. - Temp allocator is now accessed using `mem::temp()`, heap allocator using `allocator::heap()`. - Float parsing added. - Additions to std::net, ipv4/ipv6 parsing. - Stream api. - Random api. - Sha1 hash function. - Extended enumset functionality. - Updated malloc/calloc/realloc/free removing old helper functions. - Added TrackingAllocator. - Add checks to prevent incorrect alignment on malloc. - Updated clamp. - Added `Clock` and `DateTime`. - Added posix socket functions. ### Fixes - Structs returned from macros and then indexed into directly could previously be miscompiled. - Naked functions now correctly handles `asm`. - Indexing into arrays would not always widen the index safely. - Macros with implicit return didn't correctly deduct the return type. - Reevaluating a bitstruct (due to checked) would break. - Fix missing comparison between `any`. - Fix issue of designated initializers containing bitstructs. - Fix issue of designated initializers that had optional arguments. - Fixed ++ and -- for bitstructs. - Fix to bug where library source files were sometimes ignored. - Types of arrays and vectors are consistently checked to be valid. - Anonymous bitstructs check of duplicate member names fixed. - Assignment to anonymous bitstruct members in structs. - Fix casts on empty initializers. - Fix to DString reserve. - Fix where aliases did not do arithmetic promotion. - @local declarations in generic modules available by accident. - Fixes missing checks to body arguments. - Do not create debug declaration for value-only parameter. - Bug in alignment for atomics. - Fix to bug when comparing nested arrays. - Fix to bug when a macro is using rethrow. - Fixes bug initializing a const struct with a const struct value. - Fixes bug when `void` is passed to an "any"-vararg. - Fixed defer/return value ordering in certain cases. - Fixes to the x64 ABI. - Updates to how variadics are implemented. - Fixes to shift checks. - Fixes to string parsing. - Bug when rethrowing an optional from a macro which didn't return an optional. - Fixed issues with ranged cases. - Disallow trailing ',' in function parameter list. - Fixed errors on flexible array slices. - Fix of `readdir` issues on macOS. - Fix to slice assignment of distinct types. - Fix of issue casting slices to distinct types. - Fixes to `split`, `rindex_of`. - List no longer uses the temp allocator by default. - Remove test global when not in test mode. - Fix sum/product on floats. - Fix error on void! return of macros. - Removed too permissive casts on slices. - Using C files correctly places objects in the build folder. - Fix of overaligned deref. - Fix negating a float vector. - Fix where $typeof(x) { ... } would not be a valid compound literal. - Fix so that using `var` in `if (var x = ...)` works correctly. - Fix int[] -> void* casts. - Fix in utf8to16 conversions. - Updated builtin checking. - Reduce formatter register memory usage. - Fixes to the "any" type. - Fix bug in associated values. - More RISC-V tests and fixes to the ABI. - Fix issue with hex floats assumed being double despite `f` suffix. - Fix of the `tan` function. - Fixes to the aarch64 ABI when passing invalid vectors. - Fix creating typed compile time variables. - Fix bug in !floatval codegen. - Fix of visibility issues for generic methods. - Fixes to `$include`. - Fix of LLVM codegen for optionals in certain cases. - Fix of `$vasplat` when invoked repeatedly. - Fix to `$$DATE`. - Fix of attributes on nested bitstructs. - Fix comparing const values > 64 bits. - Defer now correctly invoked in expressions like `return a > 0 ? Foo.ABC! : 1`. - Fix conversion in `if (int x = foo())`. - Delay C ABI lowering until requested to prevent circular dependencies. - Fix issue with decls accidentally invalidated during `$checked` eval. - Fold optional when casting slice to pointer. - Fixed issue when using named arguments after varargs. - Fix bug initializing nested struct/unions. - Fix of bool -> vector cast. - Correctly widen C style varargs for distinct types and optionals. - Fix of too aggressive codegen in ternary codegen with array indexing. ## 0.4.0 Change List - Compatibility with LLVM 16. - Dropped LLVM 12 support. - Updated vector comparisons. - Built in unit testing with @test and compile-test - Updated memory allocators. Added `@scoped` and `@pool` macros. - Various bug fixes. - Generic modules may now be generic over integers and booleans. - Constant pointers may be compile time evaluated. - Added many new builtins. - Emit asm using `--emit-asm`. - Added `--nostdlib` and `--nolibc`. - Compiling for AVX can now select "native". - Fixes to adding libraries at link time. - Various improved error messages. - Windows debug info fixes. - Add of `foreach_r` for reverse list traversal. - Script downloading the MSVC SDK to cross compile to windows. - Many standard library additions. - Extension methods may be added for built-in types. - Macros may take vector and array arguments generic over length. - Macro varargs with $vaarg, $vacount etc. - Many vector builtins added as dot methods. - in / out / inout doc parameters checked. - Initial inline asm support for aarch64 and x64. - Single line short function declaration. - Added `$checks` builtin. - Added `$include` builtin for including other text files. - Optional single module compilation. - Static initialization / finalization to have code running at start/end. - C3 custom printf function in the stdlib. - `[]=` overload now works correctly. - Static libraries may now be built. - More compile time reflection added and general cleanup done. - usize/isize/iptrdiff/uptrdiff replaced by usz/isz. - Add `var` to allow type inference on regular variables. - LLVM codegen optimizations. - `??` now allows chaining another optional. - int128 support on all platforms. - `import` is now allowed anywhere at the top level. - `project.c3p` renamed `project.json` - Update to project properties, e.g. "libs" -> "dependencies" etc. - $$TIME, $$DATE and $$FUNCTION builtin defines added. - `$echo` function to print messages at compile time. - Improvements to untyped lists. - Various builtins added: $$prefetch, $$reverse, $$shufflevector etc. ## 0.3.0 Change List ### Changes / improvements: - Allow any expression as default expression. - Allow using enums for indexing arrays. - Added $convertible / $castable compile time functions. - Removed ´func´ deprecated keyword - Slicing a distinct type now returns the distinct type. - Renamed @autoimport -> @builtin - Zero length arrays not allowed - Allow methods may use ref, pointer and value arguments as "self" - Updated external name mangling - More advanced introspection. - @maydiscard and @nodiscard annotations - New type promotion rules: The common type of int[x]* and int[y]* is int[] - Added type.inner and type.len reflection. - Support float mod operations. - Add float.max/min. - Allow [in] contract to be used on slices. - Add linker and linked dir arguments to build files. - Auto-import std::core. - LLVM 15 support. - Better native file handling for MSVC - New import rules – recursive imports - Add lld linking for FreeBSD - User defined attributes. @Foo = @inline - Support enum associated values. - @ is now part of the name of an attribute or a macro. Macros without '@' must be function-like. - Ordinal based enums. - Allow locals to shadow global variables. - Prefer inferred constant over global in the case of MyEnum f = BAR; - Enum and fault name reflection. - Deref null error now panics in safe mode. ### Changes to stdlib: - Updated allocators. - Added enum_by_name. - Moved bitcast to builtin module. - Native printf for files and strings. - Updated String. - Comparison macros - Added Binary-Heap Based Priority Queue by David Kopec - Matrix Math Library by PixelRifts - UTF conversions in "conv" module. ### Fixes: - Attributes correctly checks for recursive definitions now. - Added a max bitstruct size. - Fix of expr location in args. - Fixing distinct, typedef and bitstruct copying. Fix where global constants did not need to be constant. - Better error on all upper parameter names. - Fix constant typeid comparisons. - Simplify and corrected if try/catch parsing. - Fix bug with { [A] = 1 } - Conversion unsigned int -> enum fixed. - Fix bug preventing implicit & on optionals. - More efficient int[] a = {} - Fix bug in extension methods for generic types and typedefs - Fix to extension methods in other modules. - Disallow complist as a regular macro parameter. - Fix in nested block handling - Fix of error where {| |} with value return could have no final return - Vararg abi fix - Fix "libs" in project creation - Fix bug with bit struct initialization and zeros - Reduce size of memory pages used. - Fix issues with union of const. - Fix initialization of anonymous structs. - Fix conversion between distinct void* and null - Fix of default project creation target format. - Fix of $sizeof(Type) => Type.sizeof - Fix stack setting after error return. - Fix module assignment of declarations - Global @align fixed - Fixes enum set with new ordinal based enums - SysV ABI fix for passing certain things by struct. - Fix implicitly converting to float in the case of myfloat *= -1