From 6b9a139f7f27422bc2d7dc3fad20d589518a93b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Tue, 19 Feb 2019 12:21:42 +0100 Subject: [PATCH] error message for accidental use of macro (#10490) * error message for accidental use of macro --- compiler/semstmts.nim | 11 +++++++++-- tests/errmsgs/t10489_a.nim | 9 +++++++++ tests/errmsgs/t10489_b.nim | 9 +++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 tests/errmsgs/t10489_a.nim create mode 100644 tests/errmsgs/t10489_b.nim diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index cd570caad..3827da220 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -448,10 +448,14 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = var def: PNode = c.graph.emptyNode if a.sons[length-1].kind != nkEmpty: def = semExprWithType(c, a.sons[length-1], {efAllowDestructor}) - if def.typ.kind == tyTypeDesc and c.p.owner.kind != skMacro: + if def.typ.kind == tyProc and def.kind == nkSym and def.sym.kind == skMacro: + localError(c.config, def.info, "cannot assign macro symbol to variable here. Forgot to invoke the macro with '()'?") + def.typ = errorType(c) + elif def.typ.kind == tyTypeDesc and c.p.owner.kind != skMacro: # prevent the all too common 'var x = int' bug: localError(c.config, def.info, "'typedesc' metatype is not valid here; typed '=' instead of ':'?") def.typ = errorType(c) + if typ != nil: if typ.isMetaType: def = inferWithMetatype(c, typ, def) @@ -583,7 +587,10 @@ proc semConst(c: PContext, n: PNode): PNode = localError(c.config, a.sons[length-1].info, errConstExprExpected) continue - if def.typ.kind == tyTypeDesc and c.p.owner.kind != skMacro: + if def.typ.kind == tyProc and def.kind == nkSym and def.sym.kind == skMacro: + localError(c.config, def.info, "cannot assign macro symbol to constant here. Forgot to invoke the macro with '()'?") + def.typ = errorType(c) + elif def.typ.kind == tyTypeDesc and c.p.owner.kind != skMacro: # prevent the all too common 'const x = int' bug: localError(c.config, def.info, "'typedesc' metatype is not valid here; typed '=' instead of ':'?") def.typ = errorType(c) diff --git a/tests/errmsgs/t10489_a.nim b/tests/errmsgs/t10489_a.nim new file mode 100644 index 000000000..7cfe0176c --- /dev/null +++ b/tests/errmsgs/t10489_a.nim @@ -0,0 +1,9 @@ +discard """ +errormsg: "cannot assign macro symbol to variable here" +line: 9 +""" + +macro m(body: untyped): untyped = + body + +let x1 = m diff --git a/tests/errmsgs/t10489_b.nim b/tests/errmsgs/t10489_b.nim new file mode 100644 index 000000000..e690f028a --- /dev/null +++ b/tests/errmsgs/t10489_b.nim @@ -0,0 +1,9 @@ +discard """ +errormsg: "cannot assign macro symbol to constant here" +line: 9 +""" + +macro m(body: untyped): untyped = + body + +const x2 = m