aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-26 09:03:00 +0200
committerlemon <lsof@mailbox.org>2022-08-26 09:03:00 +0200
commit03f945e9feb08e4525b5b73a4aec81ef11b04f7f (patch)
tree41b8e556f25281c5a3b46c9e9f6228aed386da7b
parentd08e43f70d7482543c9bb2ba548bcd31e7eba978 (diff)
vararg promote array->ptr
-rw-r--r--src/llvm.cff5
-rw-r--r--src/main.cff1
-rw-r--r--src/parse.cff5
-rw-r--r--src/type.cff2
4 files changed, 8 insertions, 5 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index c4528e8..a2a4445 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -179,7 +179,8 @@ fn gen(fmt *const u8, ...) void {
}
case StrConstRef id;
gen("@.str.%d", id);
-
+ case else
+ assert(#f, "value? %d", val.u.#tag);
}
case 't';
pritype(ap->arg(*Type));
@@ -252,6 +253,7 @@ fn genaddr(f *Fn, ex *Expr) Value {
case Dot dot;
let lhs = dot.lhs.ty->is(:Ptr) ? genexpr(f, dot.lhs) : genaddr(f, dot.lhs);
+ assert(dot.fld.ty.align > 0, "%s align %zu", dot.fld.name, dot.fld.ty.align);
assert(dot.fld.off % dot.fld.ty.align == 0, "field align %s %zu %zu",
dot.fld.name, dot.fld.off, dot.fld.ty.align);
let idx int #?;
@@ -781,6 +783,7 @@ fn genexpr(f *Fn, ex *Expr) Value {
if ty->is(:Bool) { return ty_int; };
if ty->is(:Int) { return typeof2(ty, ty); }
if ty->is(:Flo) and ty.size < 8 { return ty_f64; }
+ if ty->is(:Arr) { return mkptrtype(ty.u.Arr.child); }
return ty;
}
diff --git a/src/main.cff b/src/main.cff
index 70d8bdf..caebf9c 100644
--- a/src/main.cff
+++ b/src/main.cff
@@ -18,6 +18,5 @@ extern fn main(argc int, argv **u8) int {
llvm_init(stdout);
let decls = parse(&p);
defer free(decls.#ptr);
- llvm_fini();
}
diff --git a/src/parse.cff b/src/parse.cff
index b0b96cb..f03e13a 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -329,7 +329,7 @@ fn lex(P *Parser) Tok {
if tok.t == '#FIL' {
return { :str, tok.loc, .u: { .str: spanz(fileid2path(ep.loc.fileid)) }};
} else {
- return { :int, tok.loc, .u: { .int: ep.loc.line }};
+ return { :int, tok.loc, .ty: ty_int, .u: { .int: ep.loc.line }};
}
}
return tok;
@@ -453,7 +453,7 @@ fn lex(P *Parser) Tok {
if delim == '"' {
tok.t = :str;
str->push('\0');
- tok.u.str = str->move(P.alloc);
+ tok.u.str = str->move(P.tlalloc);
tok.u.str = tok.u.str[0::tok.u.str.#len - 1];
} else {
tok.t = :chr;
@@ -3035,6 +3035,7 @@ extern fn parse(P *Parser) [#]Decl {
}
}
+ llvm_fini();
envfree(P.curenv);
aralloc->destroy();
return decls.dat[0::decls.len];
diff --git a/src/type.cff b/src/type.cff
index c0fe157..214bda8 100644
--- a/src/type.cff
+++ b/src/type.cff
@@ -119,7 +119,7 @@ struct TypeTraits {
static types_set Set<*const Type, TypeTraits> = {};
extern fn interntype(ty0 Type) *const Type {
if ty0.align == 0 {
- ty0.align = ty0.size;
+ ty0.align = ty0.size == 0 ? 1 : ty0.size;
}
return *types_set->intern(&ty0);