mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
2097 lines
112 KiB
Markdown
2097 lines
112 KiB
Markdown
# C3C Release Notes
|
||
|
||
## 0.7.10 Change list
|
||
|
||
### Changes / improvements
|
||
- Method resolution and `$define` now works together well unless definitions are out of order for real.
|
||
|
||
### 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.
|
||
|
||
### 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.
|
||
|
||
## 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<n>` 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<unicode char>` 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(<type>) 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 ??? <expr> : <expr>`.
|
||
|
||
### 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(<int>)` 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/<platform> by default.
|
||
- Output llvm/asm into llvm/<platform> and asm/<platform> 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 <arg1>`
|
||
- 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 "<GLOBAL>" 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 <expr>:` syntax.
|
||
- `$assert` now uses `$assert <expr> : <optional message>`
|
||
- `$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
|