mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
115 KiB
115 KiB
C3C Release Notes
0.7.10 Change list
Changes / improvements
- Method resolution and
$definenow works together well unless definitions are out of order for real. - Improve error message when using functions as values #2856
- Improve support for Android with Termux.
- Integrated download of the MSVC SDK when compiling for Windows.
- For
c3c initwith library templates, provide example exported functions. #2898 unsigned % signedandunsigned / signedis no longer allowed without explicit casts, except for const denominators. #2928- New enum associated value syntax.
- Individual warning settings added.
- Change typedef and const enums to not convert from literals by default.
- Add
@constinitto allow old typedef behaviour. - Include actual element count in the error message when the array initializer size does not match the expected size.
- Add
--print-large-functionsfor checking which functions likely dominate the compile time. - Improve error message when providing
aliaswith a typeid expression where a type was expected. #2944 - Const enums removed.
- Constdef declarations introduced.
Stdlib changes
- Summarize sort macros as generic function wrappers to reduce the amount of generated code. #2831
- Remove dependency on temp allocator in String.join.
- Remove dependency on temp allocator in File.open.
- Added PEM encoding/decoding. #2858
- Add Murmur3 hash.
- Add optional line-length limitations to
io::readlineandio::readline_to_stream. #2879 - Add Xorshiro128++.
- Add single-byte code page support (DOS/OEM, Windows/ANSI, and ISO/IEC 8859).
- Add
array::even,array::odd, andarray::unlacemacros. #2892 - Add discrete and continuous distributions in
std::math::distributions. - Add bitorder functions
store_le,load_le,store_be,store_le.
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 = 5whenlist[0]returns a pointer. #2888 - Shadowing not detected for generic declarations #2876
- Const inline enums would not always implicitly get converted to the underlying type.
- Update to dstring.append_string to take any type converting to String.
- Flag
--cpu-flagsdoesn't work if the first item is an exclusion. #2905 - Reallocating overaligned memory with the LibcAllocator was unsafe.
- Using [] or .foo on $$ functions would not raise error but instead crash
- Improved underlining errors/warnings when unicode is used. #2887
- Fix std::io::Formatter integer issue for large uint128 decimal values.
--safe=nodisabled compile-time errors on compile-time known runtime @require checks #2936- On assert known false, the message was not show for no-args.
- Adding the incorrect sized vector to a pointer vector would cause a crash.
- Member access on a struct returned by the assignment expression, cause crash #2947
- Trying to slice an indexable type leads to misleading error message #2958
0.7.9 Change list
Changes / improvements
- Add
--custom-libcoption 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_intand$$int_to_maskto 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
$$VERSIONand$$PRERELEASEcompile 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?;becomesreturn io::EOF~. - Deprecated use of
?to create optional. - Make
foo.$abcimplicitly meanfoo.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.growwas broken #2622.- Hex escapes like
"\x80"would be incorrectly lowered. #2623 - Ignore const null check on deref in
$definedand$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 iffoo()would require a path.@if($defined((char*){}.foo()))does not error iffoois missing.- Hard limit of 127 characters for identifiers.
$$LINEwould sometimes yield the incorrect format.- Fix error message when a method has the wrong type for the first argument.
- Unit tests allocating too much
tmemwithout@poolwould 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
$definedwas 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.xwas not always handled correctly whenfoowas 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_allwould yield one too many empty tokens at the end.String.replaceno longer depends onString.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_fullynow 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_formatto properly iterate linked list for printing. - Hashing a vector would not use the entire vector in some cases.
- Fix to
temp_directoryon 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
$definedwith 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
@ifprocessing was not detected, causing a crash instead of an error. #2771 - Comparing an uint and int[<4>] was incorrectly assumed to be uint compared to int, causing a crash instead of an error. #2771
- When an
int[*][6]was given too few values, the compiler would assert instead of giving an error. #2771 - Inferring length from a slice was accidentally not an error.
- Eager evaluation of macro arguments would break inferred arrays on some platforms. #2771.
- Vectors not converted to arrays when passed as raw vaargs. #2776
- Second value in switch range not checked properly, causing an error on non-const values. #2777
- Broken cast from fault to array pointer #2778.
- $typeof untyped list crashes when trying to create typeid from it. #2779
- Recursive constant definition not properly detected, leading to assert #2780
- Failed to reject void compile time variables, leading to crash. #2781
- Inferring the size of a slice with an inner inferred array using {} isn't detected as error #2783
- Bug in sysv abi when passing union in with floats #2784
- When a global const has invalid attributes, handling is incorrect, leading to a crash #2785.
int? ?was not correctly handled. #2786- Casting const bytes to vector with different element size was broken #2787
- Unable to access fields of a const inline enum with an aggregate underlying type. #2802
- Using an optional type as generic parameter was not properly caught #2799
- Instantiating an alias of a user-defined type was not properly caught #2798
- Too deeply nested scopes was a fatal crash and not a regular semantic error. #2796
- Recursive definition of tag not detected with nested tag/tagof #2790
- Attrdef eval environment lacked rtype, causing error on invalid args #2797
- $typeof() returns typeinfo, causing errors #2795.
- Empty ichar slice + byte concatenation hit an assert. #2789
- Remove dependency on test tmp library for stdlib compiler tests. #2800
- Comparing a flexible array member to another type would hit an assert. #2830
- Underlying slice type not checked correctly in $defined #2829
- Checking for exhaustive cases is done even in if-chain switch if all is enum #2828
- Constant shifting incorrectly doesn't flatten the underlying vector base #2825
- String not set as attributes resolved breaking has_tagof #2824
- Self referencing forward resolved const enum fails to be properly detected #2823
- Incorrectly try compile time int check on vector #2815
- Generating typeid from function gives incorrect typeid #2816
- Recursive definitions not discovered when initializer is access on other const #2817
- Slice overrun detected late hit codegen assert #2822
- Compile time dereference of a constant slice was too generous #2821
- Constant deref of subscript had inserted checks #2818
- Raw vaargs with optional return not lowered correctly #2819
- Early exit in macro call crashes codegen #2820
- Empty enums would return the values as zero sized arrays #2838
- Store of zero in lowering did not properly handle optionals in some cases #2837
- Bitstruct accidentally allowed other arrays than char arrays #2836
- Bitstruct as substruct fails to properly work with designated initializers. #2827
- Bug when initializing an inferred array with deep structure using designated init #2826
- Packed .c3l files without compressions weren't unpacked correctly.
- Lowering of optional in && was incorrect #2843
- Resolving &X.b when X is a const incorrectly checked for runtime constness #2842
- Alignment param on $$unaligned_* not checked for zero #2844
- Fix alignment for uint128 to 16 with WASM targets.
- Incorrect assert in struct alignment checking #2841
- Packed structs sometimes not lowered as such.
- Crash when creating
$Type*where$Typeis 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
ThreadPooljoin function to wait for all threads to finish in the pool without destroying the threads. - Add
@incompile-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()andlock()is now "@maydiscard" and should be ignored. They will return void in 0.8.0. - Return of ConditionVariable
signal()broadcast()andwait()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
@maydiscardon 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
poly1305one-time Message Authentication Code and associated tests. #2639 - Add
ripemdhashing and associated tests. #2663 - Add
chacha20stream cipher and associated tests. #2643 - Add
BLAKE2(optionally keyed) cryptographic hashing with associated tests. #2648 - Add
BLAKE3XOF and associated tests. #2667 - Add
Elf32_ShdrandElf64_Shdrtostd::os::linux. - Add
any.toandany.as. - Deprecated
DString.append_chars, useDString.append_string - Deprecated
DString.append_stringfor DStrings, useDString.append_dstringinstead. - 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
AsciiCharsetconstants and combine its related compile-time/runtime macros. #2688 - Use a
Printablestruct for ansi RGB formatting instead of explicit allocation and deprecate the old method. - HashSet.len() now returns usz instead of int. #2740
- Add
mem::storeandmem::loadwhich may combine both aligned and volatile operations. - Deprecated
EMPTY_MACRO_SLOTand its related uses, in favor ofoptional_param = ...named macro arguments. #2805 - Add tracking of peak memory usage in the tracking allocator.
- Added
realloc_array,realloc_array_aligned, andrealloc_array_trytoallocator::. #2760
0.7.8 Change list
Changes / improvements
- Improve multiline string parser inside compiler #2552.
- Missing imports allowed if module
@ifevaluates to false #2251. - Add default exception handler to Win32 #2557.
- Accept
"$schema"as key inproject.json#2554. - Function referencing in
@return?for simplified fault declarations. Check@return?eagerly #2340. - Enums now work with
membersofto return the associated values. #2571 - Deprecated
SomeEnum.associatedin favour ofSomeEnum.membersof - Refactored
@simdimplementation. - Improve error message for
Foo{}whenFoois not a generic type #2574. - Support
@paramdirectives for...parameters. #2578 - Allow splatting of structs. #2555
- Deprecate
--test-nocapturein favour of--test-show-output#2588. - Xtensa target no longer enabled by default on LLVM 22, Compile with
-DXTENSA_ENABLEto 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_eqwould return false if the type was atypedefand 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 /= 0andb /= 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
Pathhandlingc:\fooand\homeparent. #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
anywould 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 catchwith a (void), would cause an assertion. #2580 - Fix decl attribute in the wrong place causing an assertion. #2581
- Passing a single value to
@wasmwould ignore the renaming. *(int*)1incorrectly 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_integerdoes 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
CGFloatCGPointCGSizeCGRecttypes to core_foundation (macOS). - Add
NSStatusItemconst enum to ns module (macOS). - Add
NSWindowCollectionBehaviorNSWindowLevelNSWindowTabbingModeto ns module (macOS). - Add
ns::eventmask_from_typefunction 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_fromfunction 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
NSApplicationTerminateReplyto ns module (macOS). - Add
registerClassPairfunction 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_replaceand$$str_pascalcase. "build-dir"option now available forproject.json, added to project. #2323- Allow
..ranges to use "a..a-1" in order to express zero length. - Disallow aliasing of
@localsymbols with a higher visibility in the alias. - Add
--max-macro-iterationsto 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
@externto@cname, deprecating the old name #2493. - Allow
(Foo)0bitstruct casts even if type sizes do not match. - The option
--riscvfloatrenamed--riscv-abi. - Add initial
--cpu-flagsallowing fine grained control over CPU features. - Add
--riscv-cpusettings 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_replaceand@str_pascalcasebuiltin 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,$offsetofand$nameofcan now be used in$defined.- Infer generic parameters lhs -> rhs:
List{int} x = list::NOHEAP. - Unify generic and regular module namespace.
env::PROJECT_VERSIONnow 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
.ordinalfrom 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 = {}whenbaris 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
ifdid 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
InterfaceListto 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
LinkedListarray_view to support[]andforeach/foreach_r. #2438 - Make
LinkedListprintable and add==operator. #2438 - CVaList support on MacOS aarch64, SysV ABI x64.
- Add
io::skipandio::read_leandio::write_lefamily of functions.
0.7.5 Change list
Changes / improvements
- Support
alias foo = module std::iomodule aliasing. - Add compile-time
@intlog2macro to math. - Add compile-time
@clzbuiltin. #2367 - Add
bitsizeofmacro builtins. #2376 - Add compile-time
@minand@maxbuiltins. #2378 - Deprecate
@compactuse for comparison. Old behaviour is enabled using--use-old-compact-eq. - Switch available for types implementing
@operator(==). Type.is_eqis 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_arrayin favour ofpush_allon 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] = bnow interpreted as(*&foo[x])[y] = bwhich allows overloads to do chained [] accesses.- Error if a stack allocated variable is too big (configurable with
--max-stack-object-size). - Add
@safeinferto allowvarto be used locally. - Types converts to typeid implicitly.
- Allow
$definedtake declarations:$defined(int x = y) - Struct and typedef subtypes inherit dynamic functions.
- Improved directory creation error messages in project and library creation commands.
@assignable_tois deprecated in favour of$define- Add
linklib-dirto c3l-libraries to place their linked libraries in. Defaults tolinked-libs - If the
os-archlinked library doesn't exist, try withosfor 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_constis deprecated in favour of directly using$defined.@is_lvalue(#value)is deprecated in favour of directly using$defined.- Added
$kindofcompile time function. - Deprecated
@typekindmacro in favour of$kindof. - Deprecated
@typeismacro in favour of$typeof(#foo) == int. $defined(#hash)will not check the internal expression, just that#hashexists. 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
@deprecatedand@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 += 1when$cwas 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_cpusfunctionality for OpenBSD systems. #2387 - Assert triggered when trying to slice a struct.
- Improve codegen for stack allocated large non-zero arrays.
- Implement
a5hashin the compiler for compile-time$$str_hashto matchString.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
@formatencountered*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_optiondidn't properly callgetsockopt, andgetsockopthad an invalid signature.- Taking the address of a label would cause a crash. #2430
@tagwas not allowed to repeat.- Lambdas on the top level were not exported by default. #2428
has_tagofon 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
logandexpno-strip. @test/@benchmarkon module would attach to interface and regular methods.- Deprecated
@selectin 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
==toPair,Tripleand TzDateTime. Add print toPairandTriple. - Add OpenBSD to
env::INET_DEVICESand add required socket constants. - Added
FileMmapto manage memory mapped files. - Add
vm::mmap_fileto memory map a file. - Updated hash functions in default hash methods.
- Added
FixedBlockPoolwhich is a memory pool for fixed size blocks. - Added the experimental
std::core::logfor logging. - Added array
@zipand@zip_intomacros. #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.valuesandString.contains_char#2386 - Added
&[]overload to HashMap. - Deprecated
PollSubscribesandPollEventsin favour ofPollSubscribeandPollEventand made them const enums. - Added
AsciiCharsetfor matching ascii characters quickly. - Added
String.trim_charset. - Added array
@reduce,@filter,@any,@all,@sum,@product, and@indices_ofmacros. String.bformathas reduced overhead.- Supplemental
roundevenhas 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
.ordinaland.from_ordinal. - Inline associated enum values are deprecated, use
--use-old-enumsto re-enable them. $typeofmay return a compile time type.- Improved error messages on missing qualifier on enum value. #2260
- Add
--echo-prefixto edit the prefix with$echostatements. Supports {FILE} and {LINE} - Catch accidental
foo == BAR;wherefoo = BAR;was most likely intended. #2274 - Improve error message when doing a rethrow in a function that doesn't return an optional.
- Add
--list-asmto view all supportedasminstructions. - 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_constis deprecated in favour of@is_constbased on$defined.- Multiline contract comments #2113
- Removed the use of temp allocator in backtrace printing.
env::AUTHORSandenv::AUTHOR_EMAILSadded.- 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::fenceproviding a thread fence. - Place output in
outby default for projects. Use temp folder for building at the command line. - Allow absolute paths for
$embed. - Add
@tryand@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
typeandptr. - 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.
$forct-state not properly popped.- Inline
r / complexfor 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-memnow works correctly again.- Casting a fault to a pointer would trigger an assert.
- Make
to_floatmore 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
$foovariables 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.
@linkson macros would not be added to calling functions.- Fix
Formatter.printreturning 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 ifawas 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.
@formatdid 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
@addrmacro. - Add
ConditionVariable.wait_untilandConditionVariable.wait_for - Added readline_to_stream that takes a stream.
- Added
RefandRefCountedexperimental functionality. - Added
Volatilegeneric type. - Added
UnalignedRefgeneric type. - Added
HashSetgeneric type. - Added
LinkedHashSetandLinkedHashMapgeneric types. - Add String conversion functions snake_case -> PascalCase and vice versa.
0.7.3 Change list
Changes / improvements
$typefromnow also accepts a constant string, and so works like$evaltype.$evaltypeis deprecated in favour of$typefrom.- Literal rules have changed, this makes
-0xFFnow a signed integer. - Implicitly convert from constant typeid to Type in
$Typeassignment, and$assignable. - Make $Type parameters accept constant typeid values.
- Deprecate
foo.#bar. - Allow inference across
&ࡼ. - Added support for custom file extensions in project.json targets.
$evalnow also works with@foo,#foo,$Fooand$fooparameters #2114.@sprintfmacro (based on the$$sprintfbuiltin) allows compile time format strings #1874.- Improve error reports when encountering a broken "if-catch".
- Add printf format to
$assertand$error#2183. - Make accepting arguments for
maina bit more liberal, acceptingmain(int argc, ZString* argv) - Make
$echoand@sprintfcorrectly stringify compile time initializers and slices. - Add
--sourcesbuild 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_deprecatedattribute 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
$definehandling of binary ops. - Fixes methodsof to pick up all sorts of extension methods. #2192
--lspsometimes does not emit end tag #2194.- Improve Android termux detection.
- Update Android ABI.
- Fixes to
@formatchecking #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. cflagsadditions for targets was not handed properly. #2209$echowould 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++andx--works on pointer vectors #2222.x += 1andx -= 1works 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_zstrandString.quick_zstr#2188. - Add comparison with
==for ZString types. is_array_or_slice_of_charandis_arrayptr_or_slice_of_charare replaced by constant@variants.@poolnow has an optionalreserveparameter, some minor changes to the temp_allocator API- io::struct_to_format now supports bitstructs.
- Add
String.escape,String.unescapefor 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 usingcompile-runandrun#2121. - Add
run-dirto project.json. - Add
quietto 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_tagofon builtin types. @jumpnow included in--list-attributes#2155.- Add
$$matrix_muland$$matrix_transposebuiltins. - Add
das floating point suffix fordoubletypes. - Deprecate
f32,f64andf128suffixes. - Allow recursive generic modules.
- Add deprecation for
@param foo "abc". - Add
--header-outputandheader-outputoptions 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]touint[2]#2115 - Assert when a macro with compile time value is discarded, e.g.
foo();wherefoo()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.
--pathdoes not interact correctly with relative path arguments #2149.- Add missing
@noreturntoos::exit. - Implicit casting from struct to interface failure for inheriting interfaces #2151.
- Distinct types could not be used with tagof #2152.
$$sat_mulwas missing.forwith incorrectvardeclaration caused crash #2154.- Check pointer/slice/etc on
[out]and¶ms. #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
#fooarguments 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_ztrandString.is_zstr - std::ascii moved into std::core::ascii. Old _m variants are deprecated, as is uint methods.
- Add
String.tokenize_allto replace the now deprecatedString.splitter - Add
String.countto count the number of instances of a string. - Add
String.replaceandString.treplaceto replace substrings within a string. - Add
Duration * IntandClock - Clockoverload. - Add
DateTime + Durationoverloads. - Add
Maybe.equalsand respective==operator when the inner type is equatable. - Add
inherit_stdiooption toSubProcessOptionsto inherit parent's stdin, stdout, and stderr instead of creating pipes. #2012 - Remove superfluous
cleanupparameter inos::exitandos::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
@requirechecks are added to the caller in safe mode. #186 - Improved error message when narrowing isn't allowed.
- Operator overloading for
+ - * / % & | ^ << >> ~ == != += -= *= /= %= &= |= ^= <<= >>= - Add
@operator_rand@operator_sattributes. - More stdlib tests:
sincos,ArenaAllocator,Slice2d. - Make aliases able to use
@deprecated. - Refactored stdlib file organization.
- Allow
@ifon 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 oldfoo[1..2] = bar. The old behaviour can be mostly retained with--use-old-slice-copy). - Added
Enum.lookupandEnum.lookup_field. c3c buildpicks 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.
@ifnow does implicit conversion to bool like$if. #2086- Fix broken enum inline -> bool conversions #2094.
@ifwas ignored on attrdef, regression 0.7 #2093.@ensurewas not included when the function doesn't return a value #2098.- Added missing
@clone_alignedand add checks to@tclone - Comparing a distinct type with an enum with an inline distinct type failed unexpectedly.
- The
%swould not properly print function pointers. - Compiler crash when passing an untyped list as an argument to
assert#2108. @ensureshould 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::Iandmath::I_Fformath::IMAGINARYandmath::IMAGINARYFthe latter is deprecated. - Add
array::containsto check for a value in an array or slice.
0.7.0 Change list
Changes / improvements
- Removed
Foo { 1, 2 }initializer. - Changed
Foo(<int>)toFoo {int}. - Removed
{| |}expression blocks. - Removed macro
&refand$varefparameters. - 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,$concatcompile time functions. - Removed
@adhocattribute. - Disallow inline use of nested generics (e.g.
List{List{int}}. - Remove
.allocator = allocatorsyntax for functions. - Remove
@operator(construct). - Removal of "any-switch".
- Allow swizzling assign, eg.
abc.xz += { 5, 10 }; - Added
$$wstr16and$$wstr32builtins. $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
$switchrequires trailing ":"$switch->$switch: - Rename
@return!to@return?and change syntax to require ":" after faults. - Remove
if (catch foo) { case ... }syntax. - Remove
[?]syntax. - Change
int!toint?syntax. - New
faultdeclaration usingfaultdef. - Enum associated values can reference the calling enum.
- Improve error message on
foo ?? io::EOFwith missing '?' #2036 - Make
@publicimport recursive. #2018 - Fault nameof prefixes the first last module path, for instance
std::io::EOFis rendered asio::EOF. - Rename
deftoalias. - Change
distinct->typedef. - Order of attribute declaration is changed for
alias. - Added
LANGUAGE_DEV_VERSIONenv constant. - Rename
anyfault->fault. !!foonow 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. tmemis now a variable.- Compile test and benchmark functions when invoking
--lsp#2058. - Added
@formatattribute 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.importcan 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]whenFoois 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 withoutnew_prefix.string::new_from_*changed tostring::from_*.String.to_utf16_copyand related changed toString.to_utf16.String.to_utf16_tcopyand related changed toString.to_temp_utf16mem::temp_newchanged tomem::tnew.mem::temp_allocand related changed tomem::talloc.mem::temp_new_arraychanged tomem::temp_array.- Add
ONHEAPvariants for List/HashMap for initializing global maps on the heap. - Remove Vec2 and other aliases from std::math. Replace
.length_sq()withsq_magnitude() - Change all hash functions to have a common
hashfunction. @wstring,@wstring32,@char32and@char16compile time macros added.- Updates to
Atomicto handle distinct types and booleans. - Added
math::iota. @poolno longer takes an argument.Allocatorinterface removesmarkandreset.- DynamicArenaAllocator has changed init function.
- Added
BackedArenaAllocatorwhich is allocated to a fixed size, then allocates on the backing allocator and supports mark/reset. AnyListnow also defaults to the temp allocator.os::getcwdandos::get_home_dirrequires an explicit allocator.file::load_newandfile::load_path_newremoved.os::exitandos::fastexitadded.
0.6.8 Change list
Changes / improvements
- Increase precedence of
(Foo) { 1, 2 } - Add
--enable-new-genericsto enableFoo{int}generic syntax. {| |}expression blocks deprecated.- c3c
--test-leak-reportflag for displaying full memory lead report if any - Output into /.build/obj/ by default.
- Output llvm/asm into llvm/ and asm/ by default.
- Add flag
--suppress-run. For commands which may run executable after building, skip the run step. #1931 - Add
--build-envfor 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
@constructbut has no arguments. - Regression,
.gitkeepfiles 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.
@ifdeclarations 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-debugsetting 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 viewto 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
defaultcase. - 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
inlineto 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.
Threadno 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
@constwhere 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-crtandlinux-crtbeginnot getting recognized as a project parameter - Fix dues to crash when converting a const vector to another vector #1864.
- Filter
$execoutput 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
defaultor onlydefault#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)&foowould not be reported as an escaping variable iffoowas 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.writeof qoi would leak memory.- Issue when having an empty
Pathor just "." set_envwould 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
pollandPOLL_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::testmodule for unit testing machinery. - New unit test default runner.
- Added weakly linked
fmodf. - Add
@selectto perform the equivalent ofa ? x : yat compile time. HashMapis nowPrintable.- Add
allocator::wrapto 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_ordinalandfault.from_ordinal - Deprecate cast-style conversion from integer <-> enum.
- Make deprecation an error in test mode.
- Add
--win-vs-dirsto override VS detection dirs. - Add
"name"project property to override the name of the resulting binary. #1719 - Improved
add-projectto 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
$foreachiteration over constant Strings and bytes. - Improved error message when accessing
@privatefrom other modules #1769. - Include
@namewhen searching for possible matches tonamein the error message. #1779 - Improve
@paramparse errors #1777 - Improved
#fooresolution 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
--lspoutput. - 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
#hasharguments from taking code that modifies ct variables. #1794 - Make stringify to recursively enter
#hashexpressions #1834.
Fixes
- Fix case trying to initialize a
char[*]*from a String. - Fix Map & HashMap
put_all_for_createnot copying all elements, causinginit_from_mapto 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-libanddynamic-liboptions 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-operatorsCLI 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_odrrather thanweakon Windows which seems to prevent issues such as #1704. - Use
weakon 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_intchecks 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
$definedin 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 = 1erroneously 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.
#foostyle 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
$elseclauses 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] = nullwas not detected to be an error #1833.
Stdlib changes
- Increase BitWriter.write_bits limit up to 32 bits.
- Updates to
Slice2d, likeget_xyand others. - Added
iter()value_iter()andkey_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
¯os. - Format functions for timedates.
- Add
@assert_leak()to assert on memory leaks in the scope. - Added
double.set_high_word(),double.set_low_word(), andfloat.set_word().
0.6.5 Change list
Changes / improvements
- Allow splat in initializers.
- Init command will now add
test-sourcestoproject.json#1520 a++may be discarded ifais 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
-qoption, make--run-onceimplicitly-q. - Add
-v,-vvand-vvvoptions 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 returnedvoid!. @builtinwas 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.removeon uninitializedHashMap. - 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, andio::TeeReaderstructs. - Updated Base32 API.
- Add
file::save. - Add
memcpy/memset/memcmpto nolibc. - Add
sort::quickselectto find the k-th smallest element in an unordered list. - Add
sort::is_sortedto 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*toanyor an interface, unless it isnull. - Defer resolution of declarations when looked up in
defaliased #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_strandio::struct_to_formatto dump struct data.io::printwill now print structs.- Improve error message when using
voidaliases 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
fnin interfaces. #1565 if (try foo)was handled incorrectly inside a defer.&selfargument not implicitly null checked. #1556.(uptr)&((Foo*)null).aincorrectly inserts a null check. #1544- Incorrect error message when
$evalis provided an invalid string. #1570 HashMap.copy_keysdid not properly copy keys which needed to be allocated #1569- Named vector component access would not fold at compile time. #1574
$definewould 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: xnamed arguments instead of.arg = x, deprecate old style. - Support splat for varargs #1352.
- Allow
varin lambdas in macros. - Support
int[*] { 1, 2, 3 }expressions. - Support inline struct designated init as if inline was anonymous.
- Introduce the
.paramsofproperty. - 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
.gitkeepfiles to project subfolders. - Add
env::COMPILER_BUILD_HASHandenv::COMPILER_BUILD_DATE - Support linking .o files in compilation command. #1417
- Slicing constant strings at compile time works.
- Add
project fetchsubcommand to fetch missing project dependencies (general and target specific) - Ability of
vendor-fetchto download the dependencies in the first specified pathdependencies-search-path - Ability of
vendor-fetchto 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
@norecurseattribute 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 = 1now 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
@bodyargument with the wrong number of parameters. - Fix reordering semantics in struct assignment.
- Regression when passing types as
#exprarguments. #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.
formatfunctions are now functions and work better with splat.- Add support for the QOI format.
- Add
io::read_new_fullyfor reading to the end of a stream. - Add
io::wrap_bytesfor reading bytes withiofunctions. - Add
rndandrand_in_rangedefault 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_atnow has variants for other types.
0.6.2 Change list
Changes / improvements
- Updated LLVM passes
- Added
is_substructtype property. - Scalar -> vector not implicit in call or assign.
- Added
--vector-convto enable the old scalar->vector conversion behaviour. - Added "weak" type aliases
def Foo = my_foo::Foo @weak; *-addkeys in targets inmanifest.jsonandproject.jsonare deprecated.- Made "add" the default for things like
sources,dependenciesand other keys in project and library files. - Give some symbol name suggestions when the path is matched.
- Don't generate .o files on
compileandcompile-runif there is nomain. - c3c init-lib does not create the directory with the .c3l suffix #1253
- Permit foreach values to be optional.
- Add
--show-backtraceoption 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
@noaliasattribute. - Add a
--run-onceoption to delete the output file after running it. - Add
@constattribute for macros, for better error messages with constant macros. - Add
wincrtsetting to libraries. - Add
+++&&&|||as replacement for$concat,$andand$or. - Add
methodsofto type info for struct, union and bitstruct. - Added
@tagtagofandhas_tagofto user defined types and members. - Added
c-include-dirsproject/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.
$execmay now provide a stdin parameter.- Introduce
$vaarg[...]syntax and deprecate the old$vaarg(...). - Similar change to
$vasplat:$vasplatand$vasplat[1..]. - Add
$member.get(value)to replacevalue.$eval($member.nameof) - Improve the error message when the compilation does not produce any files #1390.
- Add
fmodimplementation 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.libwas 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
optproject 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
-oprovides. #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/$execfixed #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_atincorrectly 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.
--pathis now properly respected.--testwill 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.
printfwill now show errors in the output when there are errors.- Bug where
if trywould work incorrectly in a macro. - Prevent loading / storing large structs with LLVM.
Stdlib changes
sendandrecvadded tolibcfor Posix / Win32.- Add support to destroy temp allocators.
- Deprecated
path.append,path.tappend,getcwd,tgetcwd,path.absolute,ls. - Deprecated
env::get_config_dir, replaced byenv::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_unsignedandtypes::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,$constand$Typearguments. - "panic-msg" setting to suppress panic message output.
- Require
@exportfunctions to have@exporttypes. - Disallow leading/trailing/duplicate '_' in module names.
- Updated mangling.
- Added
$$unaligned_loadand$$unaligned_store. --no-headersoption 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
$casestatements now pick the first match and does not evaluate the rest. manifest.jsonis now checked for incorrect keys.- Added
--list-manifest-propertiesto list the available properties inmanifest.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
@ensurewhen early returning 0 #1207. - Prevent Mach-O from removing
@initand@dynamicin a more reliable way #1200. - Fix of missing copy of parameterized custom attributes.
- Fixed crash on certain recursive function definitions #1209.
- Return the typekind "FUNC" for a function pointer.
- No longer possible to dereference a function pointer.
- Fix bug with @jump miscompile.
- Bit negate does implicit integer promotion.
- Bitstructs, unions and flexible arrays now correctly emitted in headers.
- Fix distinct inline conversions.
- Bit negating const zero flags would give an incorrect result.
- Fix to scalar -> vector conversions.
- Bug fix for rethrow + defer catch.
- Wrong size for structs containing overaligned structs #1219
- $typeof(*x) should be valid when x is an
[out]parameter #1226 - Fix ABI lowering for 128 bit vectors on Linux.
- Bad error message when using a generic method without generic parameters #1228
- Private function called from nested macro not visible to linker #1232
- Bitstructs in structs would not be correctly be handled in some cases.
- Fix problem where a $$FUNC would return "" when evaluated for a static in a function #1236.
ordinalis 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_itemremove_last_itemandremove_itemas aliases for thematchfunctions. - 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_storeand@unaligned_load. - Null ZString, DString or pointer prints "(null)" for printf.
- Updated sorting API.
- Insertion sort and counting sort added.
- Added missing
memandmem::allocatorfunctions for aligned allocations. - Added
new_init_with_arrayandtemp_init_with_arrayfor List. - Fixed posix
NativeMutex.lock_timeout. - Fixed
env::ARCH_32_BITandenv::ARCH_64_BIT. - Added
time::us.
0.6.0 Change list
Changes / improvements
@defaultimplementations for interfaces removed.any*=>any, same for interfaces.- Private / local globals now have
internalvisibility 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-dirto command line. #1155 - Allow making distinct types out of "void", "typeid", "anyfault" and faults.
- Removed
--system-linkersetting. - "Try" expressions may not be any binary or unary expressions. So for example
try foo() + 1is disallowed. - Added
$$REGISTER_SIZEfor 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.
$foreachdoesn't create an implicit syntactic scope.- Error of
@ifdepends on@if - Support
defer (catch err) - Added
print-inputcommand 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.
@paramwith 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'.
GenericListrenamedAnyList.- 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
@linkattribute. - New 'linker' build option.
- "linker" project setting updated, "system-linker" removed.
Fixes
- Struct/union members now correctly rejects members without storage size #1147.
math::powwill 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.minincorrect 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-runandrunnow 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_alignedandalloc_alignedfunctions 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
$inlineattribute. - 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
.deffiles 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
--linkerto 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
cpuidinstruction. - Removed invalid syntax from grammar.y.
outputproject 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 ?:
$$MODULEwould report the incorrect module name in macros.- Fixed debug info for globals and for/switch scopes.
outnow 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
Allocatorhelper functions. - Added
mem::allocatorfunctions corresponding to removed allocator functions. - Changed
mem::new/mem::temp_newto accept an optional initializer, and will clear by default. - Mem
_clearand_zerovariants 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_intfor 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_intfamily 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
deleteanddelete_rangeadded to DString.Splitteriterator added.splitteranditeratorString methods.load_new,load_bufferandload_tempstd::io::file functions.
0.5.0 Change List
Changes / improvements
- Trackable allocator with leak allocation backtraces.
$definedcan take a list of expressions.$andcompile time "and" which does not check expressions after the first is an error.$is_constreturns true if an expression is compile time const.$assignablereturns true is an expression may be implicitly cast to a type.$checksand@checkedremoved, 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-libto simplify library creation. - Local
constwork like namespaced globalconst. - Added
$$atomic_fetch_*builtins. - vectors may now contain pointers.
void!does not convert toanyfault.$$masked_load/$$masked_store/$$gather/$$scatterfor vector masked load/store.$$selectbuiltin for vector masked select.- Added builtin benchmarks by
benchmark,compile-benchmarkcommands and@benchmarkattribute. - 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.
$featurefor 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
$embedto 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.
@ifintroduced, other top level conditional compilation removed.- Dynamically dispatched interfaces with optional methods.
$ifnow uses$if <expr>:syntax.$assertnow uses$assert <expr> : <optional message>$erroris syntax sugar for$assert false : "Some message"$include,$echono longer has mandatory()around the arguments.$execfor including the output of files.assertno longer allows "try unwrap"- Updated cpu arguments for x86
- Removed support for ranged case statements that were floats or enums, or non-constant.
nextcasewith 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.
@stdcalletc 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
@optreturncontract, renamed@return!. - Restrict interface style functions.
- Optional propagation and assignment '!' and '?' are flipped.
- Add
lsuffix (alias for i64). - Allow getting the underlying type of anyfault.
- De-duplicate string constants.
- Change @extname => @extern.
defineandtypedefremoved.defineis replaced bydef.- LLVM "wrapper" library compilation is exception free.
privateis replaced by attribute@private.- Addition of
@localfor file local visibility. - Addition of
@publicfor 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.
$$shufflevectorreplaced with$$swizzleand$$swizzle2.- Builtin swizzle accessors.
- Lambdas, e.g
a = int(x, y) => x + y. - $$FILEPATH builtin constant.
variantrenamedany.anyerrrenamedanyfault.- Added
$$wasm_memory_sizeand$$wasm_memory_growbuiltins. - Add "link-args" for project.
- Possible to suppress entry points using
--no-entry. - Added
memory-envoption. - 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-unuseddirective for small binaries.$$atomic_storeand$$atomic_loadadded.usz/iszreplacesusizeandisize.@exportattribute to determine what is visible in precompiled libraries.- Disallow obviously wrong code returning a pointer to a stack variable.
- Add &^| operations for bitstructs.
@noinitreplaces= voidto opt-out of implicit zeroing.- Multiple declarations are now allowed in most places, eg
int a, b;. - Allow simplified (boolean) bitstruct definitions.
- Allow
@testto be placed on module declarations. - Updated name mangling for non-exports.
defer catchanddefer trystatements added.- Better errors from
$assert. @deprecatedattribute added.- Allow complex array length inference, eg
int[*][2][*] a = .... - Cleanup of cast code.
- Removal of
generickeyword. - Remove implicit cast enum <-> int.
- Allow enums to use a distinct type as the backing type.
- Update addition and subtraction on enums.
@ensurechecks only non-optional results.assertmay now take varargs for formatting.
Stdlib changes
- Tracking allocator with location.
init_new/init_tempfor allocating init methods.DString.printfis nowDString.appendf.- Tuple and Maybe types.
.as_str()replaced by.str_view()- Added
math::log(x , base)andmath::ln(x). - Hashmap keys implicitly copied if copy/free are defined.
- Socket handling.
csvpackage.- Many random functions.
- Updated posix/win32 stdlib namespacing
processstdlib- Stdlib updates to string.
- Many additions to
List:remove,array_view,add_all,compactetc - 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
Stringtype. - 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.
printflnandprintlnrenamedprintfnandprintn.- Support of roundeven.
- Added easings.
- Updated complex/matrix, added quaternion maths.
- Improved support for freestanding.
- Improved windows main support, with @winmain annotations.
SimpleHeapAllocatoradded.- Added win32 standard types.
- Added
saturatedmath. - Added
@expect,@unlikelyand@likelymacros. - Temp allocator uses memory-env to determine starting size.
- Temp allocator is now accessed using
mem::temp(), heap allocator usingallocator::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
ClockandDateTime. - 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
voidis 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
readdirissues 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
varinif (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
fsuffix. - Fix of the
tanfunction. - 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
$vasplatwhen 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
$checkedeval. - 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
@scopedand@poolmacros. - 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
--nostdliband--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_rfor 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
$checksbuiltin. - Added
$includebuiltin 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
varto allow type inference on regular variables. - LLVM codegen optimizations.
??now allows chaining another optional.- int128 support on all platforms.
importis now allowed anywhere at the top level.project.c3prenamedproject.json- Update to project properties, e.g. "libs" -> "dependencies" etc.
- $$TIME, $$DATE and $$FUNCTION builtin defines added.
$echofunction 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