The 0.6.2 release is here, and a lot has happened since 0.6.1.
Mainly it's that C3 has seen a lot of new users which have explored the corners of the compiler and also filed request for improvements.
Let's start with the language additions:
&&& and ||| operators
0.5.0 introduced the compile time $and and $or functions. These worked at
compile time and would not even type check the right hand side if the left hand
side was invalid. So for example $and(false, a < 1.0) would be accepted even if
a wasn't in the current scope.
It felt like this feature should be more part of the language proper, so two new
operators were added: &&& and ||| to replace $and and $or respectively.
They were chosen for being visually distinct. Other alternatives, such as $& were
discarded for not being sufficiently easy to spot.
The +++ operator
Somewhat on trial is the +++ operator. Similar to &&& and ||| it replaces a
compile time function – or actually two: $concat and $append. We can for example write
"name:" +++ Foo.nameof to get "name:Foo" at compile time.
The operator is slightly controversial and there will be trials with other syntax alternatives, but for now - feel welcome to try it out.
New attributes: @const, @noalias and @tag
A macro with only compile time constructs will be folded at compile time,
but until now there's not been a simple way to check it. The @const attribute
in 0.6.2 can be added to a macro to give an error if it's not completely compile
time folded.
There is also the experimental @noalias attribute to put on parameters. As might
be guessed, this indicates to the compiler that the parameter will not alias with
any other pointer, similar to C's restrict.
Finally there is the @tag attribute. It allows you to add a key-value pair to any
declaration, which later can be checked with .tagof and .has_tagof compile time
methods.
This can be used to add arbitrary metadata to types.
Compile time additions
Aside from .tagof and .has_tagof mentioned above, there is .methodsof to get
methods associated with a type, and member reflection types has a .get method to
generate runtime getters: $member.get(value). And finally is_substruct to check
if a struct has an inline member.
RISCV ASM support
Thanks to contributor Chuck Benedict, there is now inline asm for RISCV processors as well!
Language changes
With the addition of new operators, $and, $or, $concat and $append are getting
phased out.
$vasplat() also gets a new look: it can now be used directly as $vasplat
or ranged using $vasplat[2..3]. This is more consistent with the rest of the language.
Similarly $vaarg and others are getting brackets rather than parenthesis: $vaarg[2].
Implicit scalar to vector conversions is also getting a bit less generous. They now only happen with initializers and in binary expressions.
Standard library changes
There has been some added functionality, but mostly tweaks and small additions to existing features.
Fixes
On top of this the 0.6.2 release contains over 50 bug fixes, from standard library bugs to unhandled corner cases in the compiler. This is all thanks to having so many more users.
Where to next?
Language feature wise, 0.6.3 will look at named parameters and allowing more pervasive use
of splat (...) in calls.
Other than that, 0.6.3 will try to add more toolchain improvements and better support for other targets than x64 and Aarch64.
Here is the full 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.
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.
If you want to read more about C3, check out the documentation: https://c3-lang.org or download it and try it out: https://github.com/c3lang/c3c