diff options
| author | 2022-08-22 17:47:02 +0200 | |
|---|---|---|
| committer | 2022-08-22 17:47:02 +0200 | |
| commit | d74ed7fb65bf7ac245d2548ac13f3f3fdabadd16 (patch) | |
| tree | 7d98ba2472073d5414d51651742911993b5fbf81 /src/parse.cff | |
| parent | e0686f7953bbc74ff03a7a6b22c0b82995ab494e (diff) | |
llvm hello worlding
Diffstat (limited to 'src/parse.cff')
| -rw-r--r-- | src/parse.cff | 20 |
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; |