Releases¶
Available Releases¶
This section lists completed releases of the Loci Compiler Tools, in reverse version order.
v1.5¶
Available here: locic-1.5.src.tar.xz
Released on 24th September 2016, version 1.5 provides:
Compiler
- Added more links between AST and SEM for efficiency and future merge
- Added SEM::Statement::For() to (in future) avoid generating loops in Semantic Analysis
- Fixed various error messages to be more consistent (e.g. start with a lowercase letter)
- Added size_t and ssize_t to valid vararg types
- Added error for non-type arguments to capability test (A : B)
- Fixed duplicate type errors to handle clashes with non-type objects
- Print ‘previously defined here’ message for function name clash
- Moved more code generation to use IREmitter rather than using LLVM’s IRBuilder directly
Test
- Added check target that builds and tests the compiler
- Various improvements to duplicate object tests
- Added tests for covariant/contravariant casts
- Moved ‘CheckSuccess’ tests into library-specific directories (e.g. test/SemanticAnalysis)
- Added currently-disabled tests for class inheritance
- Added test for std::string length() and empty()
- Added test for destroying temporary in ternary value
- Added tests for std::path
- Added test for unichar literal
Language features
- Added override and inherit keywords to lexer and parser; class inheritance is not yet implemented
- Character literals now use new unichar type
Primitives
- Added unichar type (full type name is unichar_t)
- Added hash() methods for all integer primitives and typename_t
- Added more cast methods for various primitive types
- Implemented copy methods for null_t
Standard library
- Added std::filesystem::file_stream and std::filesystem::path
- Added empty() method for std::string
- std::hash<> now works for int; not yet extended to work with all types
- Fixed std::varray to use reverse_range<> rather than reverse_counter<>
Documentation
- Added documentation for hashing support
Dependencies
- Tested to build and work with LLVM versions 3.3 to 3.9
- llvm-abi is now a Git submodule rather than being fetched from a URL by CMake
v1.4¶
Available here: locic-1.4.src.tar.xz
Released on 25th April 2016, version 1.4 provides:
Compiler
- New and vastly better compiler diagnostics system.
- Rewritten lexer and parser to provide improved diagnostics (see http://scross.co.uk/2016/01/30/glr-vs-recursive-descent-parsing/ ).
Test
- All tests have now been moved to Lit (from CTest).
- Many more tests for diagnostics (tests added as diagnostics were converted to new system).
- New unit tests for lexer/parser.
Language features
- Renamed __empty lifetime method to __dead.
Primitives
- Added min() and max() built-in functions.
- Added built-in value generators range(), range_incl(), reverse_range() and reverse_range_incl().
- Removed is_ prefix from built-in predicates (e.g. is_movable is now just movable).
- Renamed ptr_lval to ptr_lval_t for consistency with other primitives.
- Added initial code for allowing hashable types.
Standard library
- Added initial code for hashing types (to be used in hash set/map implementations in next version).
v1.3¶
Available here: locic-1.3.src.tar.xz
Released on 8th November 2015, version 1.3 provides:
Language features
- Added named predicates (or ‘predicate aliases’)
- Added __sizeof and __alignmask methods.
- Added support for opaque structs.
- Added Lifetime Methods
- Clarified Object Memory States (enables moving with all lvalues)
- Added static assert statement.
- Fixed various aspects of value templates support.
- Constrained operator combinations to avoid precedence confusion (see Operator Overloading).
- Allowed require to be both before and after function declaration for templated functions.
- Fixed noexcept predicates value inference.
- Added syntax support for comparisons in function parameters without needing parentheses.
- Fixed method call and assignment evaluation order.
Primitives
- Added primitive function/method/interface-method pointer types.
- Added primitive static array type.
Standard library
- Fixed std.concurrency implementation to be more stable and portable.
- Modified std.container to use named predicates.
- Fixed std.memory in respect to Lifetime Methods.
Compiler
- Substantially improved llvm-abi API and backend (lots of code brought in from Clang) and integrated this into compiler.
- Moved default method generation (for ‘implicitcopy’, ‘copy’ etc.) into CodeGen.
- Modified CodeGen to emit opaque pointer types and typed pointer operations to faciliate upstream LLVM opaque pointer changes.
- Refactored CodeGen primitives into separate classes.
Test
- Added tests using LLVM’s ‘lit’ to verify compiler’s IR output.
- Added lit-based tests to check ABI correctness.
- Added new tests for all new/improved features mentioned above.
- Added many new syntax tests to check parser.
- Added tests for std.concurrency.
- Added tests for primitives.
- Added tests for sizes of empty objects.
- Added tests for destroying temporary objects.
- Added tests for evaluation order.
Other
- Documentation now automatically uploaded to website.
- Build artifacts now automatically uploaded to website (/travis).
Dependencies
v1.2¶
Available here: locic-1.2.src.tar.xz
Released on 28th March 2015, version 1.2 provides:
Language features
- const, noexcept and require predicates
- Boolean template values (for use in predicates)
- __moveto methods
- Fixing Const rules (in particular adding transitive const)
- C enums and unions
- Unused variables and values (replacing void cast syntax)
- Assert noexcept
Standard library
- UTF-8 support for Standard library strings
- Threads
- Events
- Networking (just IPv4 and TCP for this release)
Compiler
- Much easier for end users to build (now builds against LLVM Debian packages)
- Added ‘Array’, ‘StableSet’ and other containers for improved performance
- Added ‘String’ class for uniquifying strings
- Refactored support code into ‘support’ library
- Substantially improved Semantic Analysis performance
- Eliminated unnecessary generation of vtables and template generators for primitive cast/implicit_cast methods
- Fixed various CodeGen issues by enforcing stricter rules in SEM for binding references
- Fixed ownership semantics for various SEM types
- Added pre-compiled header for LLVM
Examples
- Added ‘Simulations’ example
- Removed ‘General’ example
Documentation
- Re-focused various pages to provide most important/relevant information at the start
- Added Predicates page
- Re-wrote much of Const page
- Re-wrote much of Modules page, with a new diagram of the compilation model
Test
- Larger set of tests (e.g. for C enums and unions)
- New ‘Check Success’ tests ensure code compiles without having to run JIT
- Added some initial unit tests
Other
Dependencies
- Tested to build and work with LLVM 3.3/3.4/3.5/3.6
v1.1¶
Available here: locic-1.1.src_.tar.gz
Released on 27th August 2014, version 1.1 provides:
Language features
- Switching from C++-like template expansion to use Template Generators (to allow templated APIs across module boundaries)
- Module imports and exports
- scope(success), scope(failure) and scope(exit)
- noexcept
- Type-templated functions/methods
- Type aliases
- assert and unreachable statements
- Implicit and explicit casts between types using templated methods
Standard library
- Standard library memory allocators and smart pointers
- Standard library containers
- Standard library strings
Other
- Vastly improved performance, particularly for Code Generation.
- A larger set of examples and updates to examples to demonstrate newly implemented features.
- Significantly improved documentation in reStructuredText using Sphinx, which can generate multiple output formats including HTML and PDF.
- A much larger set of integrated tests to check both accept and reject cases, as well as testing the standard library.
Dependencies
- Tested to build and work with LLVM 3.3/3.4/3.5
v1.0¶
Available here: locic-1.0.src_.tar.gz
Released on 6th April 2014, version 1.0 provides:
- Standard integer/floating point primitives
- C structs
- Functions (C-compatible)
- Multi-pass compilation, allowing symbols declarations and uses to appear in any order
- Class declarations and definitions
- Static and dynamic methods
- Default constructors (using ‘= default’ syntax)
- Type deduction for local variables (using ‘auto’ keyword)
- Exceptions, including exception hierarchies and try-catch
- Destructors (exception-safe)
- Interfaces, including polymorphic casts and virtual calls
- Algebraic datatypes, including union datatypes
- Type switch on datatypes
- Pattern matching datatypes
- Class and interface templates
- lval and ref support, including implicit lval dissolve
- Implicit lval generation (value_lval for local variables, member_lval for member variables)
- lval operations, including address, assign, dissolve and move
- const methods and cast const-correctness
- null, including null constructors for user-defined types
- Integer, floating point and C string literals
- Method name canonicalization
Future Development¶
Language Features
- Improve template argument deduction
- Fix function pointer ABI issues
- Variadic templates
- Lambdas
- User-defined reference types
- Union datatype function ‘overloading’ (i.e. splitting a function into multiple functions similar to a type-switch)
- Statically checked exception specifications
- Unit test functions
- Enum raw type specification (e.g. an enum based on a float type)
- Automatic parallelisation through ‘spawn’ and ‘sync’
- Class invariants
- Pre-conditions and post-conditions
- Compile-time introspection
- Run-time ‘reflection’
- Compile-time checking of assertions, invariants, pre-conditions and post-conditions
- Null coalescing operator
- Named parameters
Primitives
- Add static array comparison support.
- Vectorised types
- Atomic operations
Standard library
- Fix std::map implementation (std.container)
- Hash table set and map (std.container)
- Files and directories (std.filesystem)
- DNS resolution (std.network)
- IPv6 (std.network)
- UDP (std.network)
- Binary search, sorting (std.algorithm)
Compiler
- Add CMake module files to make it easier to create Loci projects
- Improve emitted debug information
- Implement ‘native’ virtual calls on LLVM 3.6+.
- Clarifying/defining implicit casting rules - mostly related to improving Semantic Analysis
- ARM ABI support
- Windows and Mac support
- Multiple error message reporting
- Improved/standardised error messages
- Emit TBAA (Type Based Alias Analysis) information
- Javascript-based build (e.g. with Emscripten) for demonstration purposes
Tools
- Generation of imports from exports
- Generation of Loci imports from C (and potentially C++) headers
- Verify imports and exports against each other
- Benchmarks of language features
- Generate C and C++ headers from Loci imports
Test
- Tests for primitives (e.g. integer overflow)
- More standard library tests
Examples
- Remove ‘events’ and ‘network’ examples (probably turn them into tests)
- Ogre3D based example
- Add Qt5-based instant messaging example