aboutsummaryrefslogtreecommitdiff
path: root/src/parse.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.cff')
-rw-r--r--src/parse.cff17
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;