From b4310d08333fcb9ae4f3e4bf1e0e5fc6599ada4e Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 31 Aug 2022 16:00:34 +0200 Subject: def x = expr -> defmacro x = expr, def const -> def --- src/parse.cff | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/parse.cff') diff --git a/src/parse.cff b/src/parse.cff index b1dca70..112c432 100644 --- a/src/parse.cff +++ b/src/parse.cff @@ -3159,8 +3159,6 @@ fn parsedecls(P *Parser, loc Loc, yield DeclYielder, yarg *void, toplevel bool) case lexmatch(P, &tok, :kw_def); do { - let konst = lexmatch(P, #null, :kw_const); - let tok = lexexpect(P, :ident), name = tok.u.ident, ini Expr #?, @@ -3177,8 +3175,10 @@ fn parsedecls(P *Parser, loc Loc, yield DeclYielder, yarg *void, toplevel bool) if !typematchestarg(ty, ini.ty) { err(P, ini.loc, "incompatible initializer (%t, expected %t)", ini.ty, ty); } - let f = fold(&ini); - if konst and !f { + if ty != ini.ty { + ini = { ini.loc, ty, :Cast(exprdup(P.alloc, ini)) }; + } + if !fold(&ini) { err(P, ini.loc, "cannot evaluate expression at compile time"); } decl = putdecl(P, tok.loc, { name, tok.loc, .u: :Def(ini) }); @@ -3194,7 +3194,14 @@ fn parsedecls(P *Parser, loc Loc, yield DeclYielder, yarg *void, toplevel bool) case lexmatch(P, &tok, :kw_defmacro); let name = lexexpects(P, :ident, "macro name").u.ident; - decl = parsemacro(P, tok.loc, name); + if lexmatch(P, &tok, '=') { + // defmacro x = expr + let ini = parseexpr(P); + decl = putdecl(P, tok.loc, { name, tok.loc, .u: :Def(ini) }); + lexexpect(P, ';'); + } else { + decl = parsemacro(P, tok.loc, name); + } case lexmatch(P, &tok, :kw_typedef); let name = lexexpects(P, :ident, "typedef name").u.ident; -- cgit v1.2.3