aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-26 07:42:27 +0200
committerlemon <lsof@mailbox.org>2022-08-26 07:42:27 +0200
commitd08e43f70d7482543c9bb2ba548bcd31e7eba978 (patch)
tree399d55b97973c226feffb100fb12336ca049e7e7
parent2a25159b7e5f7f94300aa68251a3598ed4fed824 (diff)
gensym fix, offset fix, str statics
-rw-r--r--bootstrap/test.cff20
-rw-r--r--src/llvm.cff10
-rw-r--r--src/parse.cff4
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;