feat(achilles): Implement a Unit type
Add support for a zero-sized Unit type. This requires some special at the codegen level because LLVM (unsurprisingly) only allows Void types in function return position - to make that a little easier to handle there's a new pass that strips any unit-only expressions and pulls unit-only function arguments up to new `let` bindings, so we never have to actually pass around unit values. Change-Id: I0fc18a516821f2d69172c42a6a5d246b23471e38 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2695 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
This commit is contained in:
parent
db62866d82
commit
8e13b1303a
16 changed files with 447 additions and 88 deletions
|
|
@ -8,7 +8,7 @@ use test_strategy::Arbitrary;
|
|||
|
||||
use crate::codegen::{self, Codegen};
|
||||
use crate::common::Result;
|
||||
use crate::passes::hir::monomorphize;
|
||||
use crate::passes::hir::{monomorphize, strip_positive_units};
|
||||
use crate::{parser, tc};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Arbitrary)]
|
||||
|
|
@ -55,9 +55,10 @@ pub struct CompilerOptions {
|
|||
|
||||
pub fn compile_file(input: &Path, output: &Path, options: &CompilerOptions) -> Result<()> {
|
||||
let src = fs::read_to_string(input)?;
|
||||
let (_, decls) = parser::toplevel(&src)?; // TODO: statements
|
||||
let (_, decls) = parser::toplevel(&src)?;
|
||||
let mut decls = tc::typecheck_toplevel(decls)?;
|
||||
monomorphize::run_toplevel(&mut decls);
|
||||
strip_positive_units::run_toplevel(&mut decls);
|
||||
|
||||
let context = codegen::Context::create();
|
||||
let mut codegen = Codegen::new(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue