mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
303 lines
12 KiB
Markdown
303 lines
12 KiB
Markdown
# C3C Release Notes
|
||
|
||
## 0.5.0 Change List
|
||
|
||
### Changes / improvements
|
||
- `@dynamic` and `@interface` for dynamic dispatch.
|
||
- `$if` now uses `$if <expr>:` syntax.
|
||
- `$assert` now uses `$assert <expr> : <optional message>`
|
||
- `$error` is syntax sugar for `$assert false : "Some message"`
|
||
- `$include`, `$echo` no longer has mandatory `()` around the arguments.
|
||
- Dropped support for LLVM 13-14.
|
||
- Updated grammar and lexer definition.
|
||
- Removal of `$elif`.
|
||
- Empty fault definitions is now an error.
|
||
- Better errors on incorrect bitstruct syntax.
|
||
- Internal use wildcard type rather than optional wildcard.
|
||
- Experimental scaled vector type removed.
|
||
- Disallow parameterize attributes without parameters eg `define @Foo() = { @inline }`.
|
||
- Handle `@optreturn` contract, renamed `@return!`.
|
||
- Restrict interface style functions.
|
||
- Optional propagation and assignment '!' and '?' are flipped.
|
||
- Add `l` suffix (alias for i64).
|
||
- Allow getting the underlying type of anyfault.
|
||
- De-duplicate string constants.
|
||
- Change @extname => @extern.
|
||
- `define` is replaced by `def`.
|
||
- LLVM "wrapper" library compilation is exception free.
|
||
- `private` is replaced by attribute `@private`.
|
||
- Addition of `@local` for file local visibility.
|
||
- Addition of `@public` for overriding default visibility.
|
||
- Default visibility can be overridden per module compile unit. Eg `module foo @private`.
|
||
- Addition of unary `+`.
|
||
- Remove the `:` and `;` used in $if, $switch etc.
|
||
- Faults have an ordinal.
|
||
- Generic module contracts.
|
||
- Type inference on enum comparisons, e.g `foo_enum == ABC`.
|
||
- Allow {} to initialize basic types.
|
||
- String literals default to `String`.
|
||
- More const modification detection.
|
||
- C3L zip support.
|
||
- Support printing object files.
|
||
- Downloading of libraries using vendor "fetch".
|
||
- Structural casts removed.
|
||
- Added "native" option for vector capability.
|
||
- `$$shufflevector` replaced with `$$swizzle` and `$$swizzle2`.
|
||
- Builtin swizzle accessors.
|
||
- Lambdas, e.g `a = int(x, y) => x + y`.
|
||
- $$FILEPATH builtin constant.
|
||
- `variant` renamed `any`.
|
||
- `anyerr` renamed `anyfault`.
|
||
- Added `$$wasm_memory_size` and `$$wasm_memory_grow` builtins.
|
||
- Add "link-args" for project.
|
||
- Possible to suppress entry points using `--no-entry`.
|
||
- Added `memory-env` option.
|
||
- Use the .wasm extension on WASM binaries.
|
||
- Update precedence clarification rules for ^|&.
|
||
- Support for casting any expression to `void`.
|
||
- Win 32-bit processor target removed.
|
||
- Insert null-check for contracts declaring & params.
|
||
- Support user defined attributes in generic modules.
|
||
- `--strip-unused` directive for small binaries.
|
||
- `$$atomic_store` and `$$atomic_load` added.
|
||
- `usz`/`isz` replaces `usize` and `isize`.
|
||
- `@export` attribute to determine what is visible in precompiled libraries.
|
||
- Disallow obviously wrong code returning a pointer to a stack variable.
|
||
- Add &^| operations for bitstructs.
|
||
- `@noinit` replaces `= void` to opt-out of implicit zeroing.
|
||
- Multiple declarations are now allowed in most places, eg `int a, b;`.
|
||
- Allow simplified (boolean) bitstruct definitions.
|
||
- Allow `@test` to be placed on module declarations.
|
||
- Updated name mangling for non-exports.
|
||
- `defer catch` and `defer try` statements added.
|
||
- Better errors from `$assert`.
|
||
- `@deprecated` attribute added.
|
||
- Allow complex array length inference, eg `int[*][2][*] a = ...`.
|
||
- Cleanup of cast code.
|
||
- Removal of `generic` keyword.
|
||
- Remove implicit cast enum <-> int.
|
||
- Allow enums to use a distinct type as the backing type.
|
||
- Update addition and subtraction on enums.
|
||
- `@ensure` checks only non-optional results.
|
||
|
||
### Stdlib changes
|
||
- Stdlib updates to string.
|
||
- Many additions to `List`: `remove`, `array_view`, `add_all`, `compact` etc
|
||
- Added dstringwriter.
|
||
- Improved printf formatting.
|
||
- is_finite/is_nam/is_inf added.
|
||
- OnStack allocator to easily allocate a stack buffer.
|
||
- File enhancements: mkdir, rmdir, chdir.
|
||
- Path type for file path handling.
|
||
- Distinct `String` type.
|
||
- VarString replaced by DString.
|
||
- Removal of std::core::str.
|
||
- JSON parser and general Object type.
|
||
- Addition of `EnumMap`.
|
||
- RC4 crypto.
|
||
- Matrix identity macros.
|
||
- compare_exchange added.
|
||
- `printfln` and `println` renamed `printfn` and `printn`.
|
||
- Support of roundeven.
|
||
- Added easings.
|
||
- Updated complex/matrix, added quaternion maths.
|
||
- Improved support for freestanding.
|
||
- Improved windows main support, with @winmain annotations.
|
||
- `SimpleHeapAllocator` added.
|
||
- Added win32 standard types.
|
||
- Added `saturated` math.
|
||
- Added `@expect`, `@unlikely` and `@likely` macros.
|
||
- Temp allocator uses memory-env to determine starting size.
|
||
- Temp allocator is now accessed using `mem::temp()`, heap allocator using `mem::heap()`.
|
||
- Float parsing added.
|
||
- Additions to std::net, ipv4/ipv6 parsing.
|
||
- Stream api.
|
||
- Random api.
|
||
- Sha1 hash function.
|
||
- Extended enumset functionality.
|
||
- Updated malloc/calloc/realloc/free removing old helper functions.
|
||
- Added TrackingAllocator.
|
||
- Add checks to prevent incorrect alignment on malloc.
|
||
- Updated clamp.
|
||
- Added `Clock` and `DateTime`.
|
||
|
||
### Fixes
|
||
- Fixes to the x64 ABI.
|
||
- Updates to how variadics are implemented.
|
||
- Fixes to shift checks.
|
||
- Fixes to string parsing.
|
||
- Disallow trailing ',' in function parameter list.
|
||
- Fixed errors on flexible array slices.
|
||
- Fix of `readdir` issues on macOS.
|
||
- Fix to slice assignment of distinct types.
|
||
- Fix of issue casting subarrays 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 subarrays.
|
||
- Using C files correctly places objects in the build folder.
|
||
- Fix of overaligned deref.
|
||
- Fix negating a float vector.
|
||
- Fix where $typeof(x) { ... } would not be a valid compound literal.
|
||
- Fix so that using `var` in `if (var x = ...)` works correctly.
|
||
- Fix int[] -> void* casts.
|
||
- Fix in utf8to16 conversions.
|
||
- Updated builtin checking.
|
||
- Reduce formatter register memory usage.
|
||
- Fixes to the "any" type.
|
||
- Fix bug in associated values.
|
||
- More RISC-V tests and fixes to the ABI.
|
||
- Fix issue with hex floats assumed being double despite `f` suffix.
|
||
- Fix of the `tan` function.
|
||
- Fixes to the aarch64 ABI when passing invalid vectors.
|
||
- Fix creating typed compile time variables.
|
||
- Fix bug in !floatval codegen.
|
||
- Fix of visibility issues for generic methods.
|
||
- Fixes to `$include`.
|
||
- Fix of LLVM codegen for optionals in certain cases.
|
||
- Fix of `$vasplat` when invoked repeatedly.
|
||
- Fix to `$$DATE`.
|
||
- Fix of attributes on nested bitstructs.
|
||
- Fix comparing const values > 64 bits.
|
||
- Defer now correctly invoked in expressions like `return a > 0 ? Foo.ABC! : 1`.
|
||
- Fix conversion in `if (int x = foo())`.
|
||
- Delay C ABI lowering until requested to prevent circular dependencies.
|
||
- Fix issue with decls accidentally invalidated during `$checked` eval.
|
||
- Fold optional when casting slice to pointer.
|
||
- Fixed issue when using named arguments after varargs.
|
||
- Fix bug initializing nested struct/unions.
|
||
- Fix of bool -> vector cast.
|
||
- Correctly widen C style varargs for distinct types and optionals.
|
||
- Fix of too aggressive codegen in ternary codegen with array indexing.
|
||
|
||
## 0.4.0 Change List
|
||
|
||
- Compatibility with LLVM 16.
|
||
- Dropped LLVM 12 support.
|
||
- Updated vector comparisons.
|
||
- Built in unit testing with @test and compile-test
|
||
- Updated memory allocators. Added `@scoped` and `@pool` macros.
|
||
- Various bug fixes.
|
||
- Generic modules may now be generic over integers and booleans.
|
||
- Constant pointers may be compile time evaluated.
|
||
- Added many new builtins.
|
||
- Emit asm using `--emit-asm`.
|
||
- Added `--nostdlib` and `--nolibc`.
|
||
- Compiling for AVX can now select "native".
|
||
- Fixes to adding libraries at link time.
|
||
- Various improved error messages.
|
||
- Windows debug info fixes.
|
||
- Add of `foreach_r` for reverse list traversal.
|
||
- Script downloading the MSVC SDK to cross compile to windows.
|
||
- Many standard library additions.
|
||
- Extension methods may be added for built-in types.
|
||
- Macros may take vector and array arguments generic over length.
|
||
- Macro varargs with $vaarg, $vacount etc.
|
||
- Many vector builtins added as dot methods.
|
||
- in / out / inout doc parameters checked.
|
||
- Initial inline asm support for aarch64 and x64.
|
||
- Single line short function declaration.
|
||
- Added `$checks` builtin.
|
||
- Added `$include` builtin for including other text files.
|
||
- Optional single module compilation.
|
||
- Static initialization / finalization to have code running at start/end.
|
||
- C3 custom printf function in the stdlib.
|
||
- `[]=` overload now works correctly.
|
||
- Static libraries may now be built.
|
||
- More compile time reflection added and general cleanup done.
|
||
- usize/isize/iptrdiff/uptrdiff replaced by usz/isz.
|
||
- Add `var` to allow type inference on regular variables.
|
||
- LLVM codegen optimizations.
|
||
- `??` now allows chaining another optional.
|
||
- int128 support on all platforms.
|
||
- `import` is now allowed anywhere at the top level.
|
||
- `project.c3p` renamed `project.json`
|
||
- Update to project properties, e.g. "libs" -> "dependencies" etc.
|
||
- $$TIME, $$DATE and $$FUNCTION builtin defines added.
|
||
- `$echo` function to print messages at compile time.
|
||
- Improvements to untyped lists.
|
||
- Various builtins added: $$prefetch, $$reverse, $$shufflevector etc.
|
||
|
||
## 0.3.0 Change List
|
||
|
||
### Changes / improvements:
|
||
|
||
- Allow any expression as default expression.
|
||
- Allow using enums for indexing arrays.
|
||
- Added $convertable / $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 subarray types.
|
||
- Add linker and linked dir arguments to build files.
|
||
- Auto-import std::core.
|
||
- LLVM 15 support.
|
||
- Beter 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
|