diff options
Diffstat (limited to 'src/parse.cff')
| -rw-r--r-- | src/parse.cff | 17 |
1 files changed, 12 insertions, 5 deletions
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; |