aboutsummaryrefslogtreecommitdiff
path: root/src/parse.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-22 17:47:02 +0200
committerlemon <lsof@mailbox.org>2022-08-22 17:47:02 +0200
commitd74ed7fb65bf7ac245d2548ac13f3f3fdabadd16 (patch)
tree7d98ba2472073d5414d51651742911993b5fbf81 /src/parse.cff
parente0686f7953bbc74ff03a7a6b22c0b82995ab494e (diff)
llvm hello worlding
Diffstat (limited to 'src/parse.cff')
-rw-r--r--src/parse.cff20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/parse.cff b/src/parse.cff
index 84ed1fe..699762c 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -966,7 +966,7 @@ fn xident2type(P *Parser, eloc Loc, name *const u8) *const Type {
fn parsefnparams(P *Parser, variadic *bool, paramnames *Vec<*const u8>, paramtys *Vec<*const Type>) void {
lexexpect(P, '(');
let tok Tok #?;
- *variadic = #t;
+ *variadic = #f;
while !lexmatch(P, &tok, ')') {
if lexmatch(P, #null, '...') {
*variadic = #t;
@@ -1513,7 +1513,7 @@ fn pexpostfix(P *Parser) Expr {
P.targty = args.len + 1 <= params.#len ? *param : #null;
let ex = parseexpr(P);
args->push(ex);
- if args.len >= params.#len and !Fn.variadic {
+ if args.len > params.#len and !Fn.variadic {
fatal(P, ex.loc, "too many args (%z, expected %z)", args.len, params.#len);
}
if args.len <= params.#len and !typematchestarg(*param, ex.ty) {
@@ -2397,7 +2397,8 @@ fn parsevardecl(P *Parser, toplevel bool, externp bool, letp bool, yield DeclYie
ty = constify(ty);
}
- let decl Decl = { name, tok.loc, externp, :Let { ty, ini, fwd, P.curfn ? P.curfn.id : 0, } };
+ let decl Decl = { name, tok.loc, externp, toplevel,
+ :Let { ty, ini, fwd, P.curfn ? P.curfn.id : 0, } };
if letp {
decl.u.Let.id = P.varid++;
} else {
@@ -2414,7 +2415,7 @@ fn parsevardecl(P *Parser, toplevel bool, externp bool, letp bool, yield DeclYie
} while !lexmatch(P, &tok, ';');
}
-fn parsefn(P *Parser, loc Loc, externp bool, name *const u8) *Decl {
+fn parsefn(P *Parser, loc Loc, toplevel bool, externp bool, name *const u8) *Decl {
let decl Decl = {
name,
loc,
@@ -2435,9 +2436,13 @@ fn parsefn(P *Parser, loc Loc, externp bool, name *const u8) *Decl {
static id int = 0;
Fn.id = ++id;
let decl = putdecl(P, loc, decl);
-
+ decl.toplevel = toplevel;
+
if !lexmatch(P, #null, '{') {
lexexpects(P, ';', "';' or '{'");
+ if toplevel {
+ llvm_addfn(decl);
+ }
return decl;
}
@@ -2463,6 +2468,9 @@ fn parsefn(P *Parser, loc Loc, externp bool, name *const u8) *Decl {
(as(*Arena)P.alloc.a)->destroy();
}
}
+ if toplevel {
+ llvm_addfn(decl);
+ }
P.varid = varid;
P.loopid = loopid;
return decl;
@@ -2700,7 +2708,7 @@ fn parsedecls(P *Parser, loc Loc, yield DeclYielder, yarg *void, toplevel bool)
switch {
case lexmatch(P, &tok, :kw_fn);
let name = lexmatch(P, &tok, :ident) ? tok.u.ident : #null;
- decl = parsefn(P, tok.loc, externp, name);
+ decl = parsefn(P, tok.loc, toplevel, externp, name);
case lexmatch(P, &tok, :kw_import);
let path = (tok = lexexpects(P, :str, "import path")).u.str.#ptr;