diff options
| author | 2022-08-26 07:42:27 +0200 | |
|---|---|---|
| committer | 2022-08-26 07:42:27 +0200 | |
| commit | d08e43f70d7482543c9bb2ba548bcd31e7eba978 (patch) | |
| tree | 399d55b97973c226feffb100fb12336ca049e7e7 | |
| parent | 2a25159b7e5f7f94300aa68251a3598ed4fed824 (diff) | |
gensym fix, offset fix, str statics
| -rw-r--r-- | bootstrap/test.cff | 20 | ||||
| -rw-r--r-- | src/llvm.cff | 10 | ||||
| -rw-r--r-- | src/parse.cff | 4 |
3 files changed, 31 insertions, 3 deletions
diff --git a/bootstrap/test.cff b/bootstrap/test.cff index 3a7599a..6b0e188 100644 --- a/bootstrap/test.cff +++ b/bootstrap/test.cff @@ -82,6 +82,17 @@ enum union Number { flo f32, } +defmacro match(ty, x, &body) [ + (do + let $res ty = {}; + #'match do { + defmacro yield(X) [ $res = (X); break #'match ] + switch (x) body + } while #f; + $res; + ) +] + extern fn main (argc int, argv **u8) int { let colors [3]Color = { :Red, :Green, :Blue } ; @@ -95,6 +106,13 @@ extern fn main (argc int, argv **u8) int { let x = Number:none; let x = Number:int{}; + printf("match: %d\n", match(int, x) { + case none; yield(42); + case int i; yield(i - 7); + case flo f; yield(f * 0.5f); + }); + + let is []int = { [4] = 1, 2, [1 - 1] = 3 }; isort(is, is.#len); each(i, x, is) { @@ -102,6 +120,8 @@ extern fn main (argc int, argv **u8) int { } let slice [#]int = is[3::5]; + static test *const u8 = "hi"; + printf("sl %d\n", slice[0]); slice = slice[1::4]; printf("sl %d\n", slice[0]); diff --git a/src/llvm.cff b/src/llvm.cff index a33ca56..c4528e8 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -1017,7 +1017,8 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void { if c.capt { gen("\t%%%s.%d = alloca %t\n", c.capt, c.captid, c.captty); let valaddr = mktmp(mkptrtype(c.fld.ty)); - gen("\t%v = getelementptr i8, %t %v, i32 %d\n", valaddr, exaddr.ty, exaddr, as(int)c.fld.off); + gen("\t%v = getelementptr i8, %t %v, i32 %d\n", valaddr, exaddr.ty, exaddr, + as(int)c.fld.off); if c.captptr { gen("\tstore %t %v, %t %%%s.%d\n", valaddr.ty, valaddr, mkptrtype(c.captty), c.capt, c.captid); } else { @@ -1167,6 +1168,13 @@ fn gendata(ty *const Type, ex *Expr) void { case BoolLit b; return gen("%d", b); case NullLit; return gen("null"); case ZeroIni; return gen("zeroinitializer"); + case StrLit s; + if ty->is(:Arr) { + return gen("c%S", s); + } else { + strs->push(s); + return gen("@.str.%z", strs.len - 1); + } } assert(#f, "bad static"); } diff --git a/src/parse.cff b/src/parse.cff index e1b5f58..b0b96cb 100644 --- a/src/parse.cff +++ b/src/parse.cff @@ -733,7 +733,7 @@ fn parseagg(P *Parser, loc Loc, kind AggKind, name *const u8, retdecl **Decl) *c let size = 0z, align = 1z; let flds Vec<AggField> = {}; let havedecls = #f; - let f0align = -1zs; + let f0align = 0zs; while !lexmatch(P, &tok, '}') { if isdecltokt(lexpeek(P).t) { havedecls = #t; @@ -2745,7 +2745,7 @@ fn parsemacro(P *Parser, loc Loc, name *const u8) *Decl { gs.tok.t = :ident; gs.tok.loc = tok.loc; let s [300]u8 = {}; - snprintf(s, sizeof(s) - 1, "#<gensym %s %d>", tok.u.ident, gensymid++); + snprintf(s, sizeof(s) - 1, ".gensym.%s.%d", tok.u.ident, gensymid++); gs.tok.u.ident = internstr(s); tok = gs.tok; gs.next = gensyms; |