diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/semexprs.nim | 16 | ||||
-rw-r--r-- | compiler/semstmts.nim | 4 |
2 files changed, 11 insertions, 9 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 3d41b592c..b6a69ebee 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -62,12 +62,18 @@ proc semOperand(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = renderTree(result, {renderNoComments})) result.typ = errorType(c) -proc semExprWithType(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = +proc semExprCheck(c: PContext, n: PNode, flags: TExprFlags): PNode = rejectEmptyNode(n) result = semExpr(c, n, flags+{efWantValue}) if result.kind == nkEmpty: + # bug #12741, redundant error messages are the lesser evil here: + localError(c.config, n.info, errExprXHasNoType % + renderTree(result, {renderNoComments})) # do not produce another redundant error message: result = errorNode(c, n) + +proc semExprWithType(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = + result = semExprCheck(c, n, flags) if result.typ == nil or result.typ == c.enforceVoidContext: localError(c.config, n.info, errExprXHasNoType % renderTree(result, {renderNoComments})) @@ -76,11 +82,7 @@ proc semExprWithType(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = if result.typ.kind in {tyVar, tyLent}: result = newDeref(result) proc semExprNoDeref(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = - rejectEmptyNode(n) - result = semExpr(c, n, flags+{efWantValue}) - if result.kind == nkEmpty: - # do not produce another redundant error message: - result = errorNode(c, n) + result = semExprCheck(c, n, flags) if result.typ == nil: localError(c.config, n.info, errExprXHasNoType % renderTree(result, {renderNoComments})) @@ -192,7 +194,7 @@ proc isCastable(conf: ConfigRef; dst, src: PType): bool = if conf.selectedGC in {gcArc, gcOrc}: let d = skipTypes(dst, abstractInst) let s = skipTypes(src, abstractInst) - if d.kind == tyRef and s.kind == tyRef and s[0].isFinal != d[0].isFinal: + if d.kind == tyRef and s.kind == tyRef and s[0].isFinal != d[0].isFinal: return false var dstSize, srcSize: BiggestInt diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 992f05e32..986953ab2 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1476,9 +1476,9 @@ proc semProcAnnotation(c: PContext, prc: PNode; let ident = considerQuotedIdent(c, key) if strTableGet(c.userPragmas, ident) != nil: continue # User defined pragma - else: + else: let sym = searchInScopes(c, ident) - if sym != nil and sfCustomPragma in sym.flags: + if sym != nil and sfCustomPragma in sym.flags: continue # User custom pragma # we transform ``proc p {.m, rest.}`` into ``m(do: proc p {.rest.})`` and |