diff options
| author | 2022-08-26 09:03:00 +0200 | |
|---|---|---|
| committer | 2022-08-26 09:03:00 +0200 | |
| commit | 03f945e9feb08e4525b5b73a4aec81ef11b04f7f (patch) | |
| tree | 41b8e556f25281c5a3b46c9e9f6228aed386da7b | |
| parent | d08e43f70d7482543c9bb2ba548bcd31e7eba978 (diff) | |
vararg promote array->ptr
| -rw-r--r-- | src/llvm.cff | 5 | ||||
| -rw-r--r-- | src/main.cff | 1 | ||||
| -rw-r--r-- | src/parse.cff | 5 | ||||
| -rw-r--r-- | src/type.cff | 2 |
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); |