aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bootstrap/test2.cff4
-rw-r--r--src/cffc.hff1
-rw-r--r--src/llvm.cff17
-rw-r--r--src/parse.cff16
-rw-r--r--test/2.cff1
5 files changed, 34 insertions, 5 deletions
diff --git a/bootstrap/test2.cff b/bootstrap/test2.cff
index f5dec29..c9ef3c9 100644
--- a/bootstrap/test2.cff
+++ b/bootstrap/test2.cff
@@ -82,7 +82,9 @@ extern fn main() void {
}
printf("n %d\n", n.value);
- printf("n link %d\n", n.link.value);
+ printf("n li"
+ "nk %d\n", n.link.value);
+
let x Node<f32> = {};
n->ok();
diff --git a/src/cffc.hff b/src/cffc.hff
index 7dc9cfa..e329965 100644
--- a/src/cffc.hff
+++ b/src/cffc.hff
@@ -498,6 +498,7 @@ extern fn ir_free(*IRCtx) void;
extern static g_asmbackend Backend;
// llvm.cff
+extern fn llvm_addtype(*const Type) void;
extern fn llvm_addglobl(*Decl, staticp bool) void;
extern fn llvm_genfn(externp bool, name *const u8, f *Fn) void;
extern fn llvm_genstatic(externp bool, name *const u8, var *Var) void;
diff --git a/src/llvm.cff b/src/llvm.cff
index 0031777..eb13919 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -72,6 +72,15 @@ extern fn genagg(ty *const Type) void {
}
}
+extern fn llvm_addtype(ty *const Type) void {
+ if ty.u.#tag == :Agg and !ty.u.Agg.fwd {
+ gen("%%type.%s.%d = type ", ty.u.Agg.name ?? as(*u8)".", ty.u.Agg.id);
+ genagg(ty);
+ gen("\n");
+ }
+}
+
+
fn gendata(ty *const Type, ex *Expr) void;
fn gen(fmt *const u8, ...) void {
let ap va_list #?;
@@ -93,8 +102,12 @@ fn gen(fmt *const u8, ...) void {
case Arr arr;
assert(arr.length >= 0, "arr length");
gen("[%z x %t]", arr.length, arr.child);
- case Agg;
- genagg(ty);
+ case Agg agg;
+ if agg.fwd {
+ genagg(ty);
+ } else {
+ gen("%%type.%s.%d", ty.u.Agg.name ?? as(*u8)".", ty.u.Agg.id);
+ }
case Enum enu; pritype(enu.intty);
case BitF bitf; pritype(bitf.intty);
case Fn f;
diff --git a/src/parse.cff b/src/parse.cff
index 5c3ac63..2e6cec9 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -804,6 +804,7 @@ fn parseagg(P *Parser, loc Loc, kind AggKind, name *const u8, retdecl **Decl) *c
fld.off += off;
}
}
+ llvm_addtype(ty);
if havedecls {
agg.decls = mkenv(P.curenv, P.alloc);
constty.u.Agg.decls = agg.decls;
@@ -1461,8 +1462,19 @@ fn pexprimary(P *Parser) Expr {
ex = { tok.loc, ty_voidptr, .u: :NullLit };
case :str;
- let ty = mkarrtype(tok.u.str.#len + 1, #t, ty_u8);
- ex = { tok.loc, ty, .u: :StrLit(tok.u.str) };
+ let str = tok.u.str;
+ let s Vec<u8> = {};
+ if lexpeek(P).t == :str {
+ foreach (c, _, tok.u.str) { s->push(c); }
+ while lexmatch(P, &tok, :str) {
+ foreach (c, _, tok.u.str) { s->push(c); }
+ }
+ s->push('\0');
+ --s.len;
+ str = s->move(P.tlalloc);
+ }
+ let ty = mkarrtype(str.#len + 1, #t, ty_u8);
+ ex = { tok.loc, ty, .u: :StrLit(str) };
case :ident;
let ident = tok.u.ident;
diff --git a/test/2.cff b/test/2.cff
index 04560ca..deb300c 100644
--- a/test/2.cff
+++ b/test/2.cff
@@ -16,4 +16,5 @@ extern fn main() int {
foo.num = -2;
foo.num *= 10;
printf("0x%X: %d, %d, %d\n", foo.#raw, foo.tag, foo.flag, foo.num += 532);
+ let long = "abcd" "defg";
}