diff options
-rw-r--r-- | compiler/semexprs.nim | 16 | ||||
-rw-r--r-- | compiler/semstmts.nim | 4 | ||||
-rw-r--r-- | tests/concepts/texplain.nim | 84 | ||||
-rw-r--r-- | tests/errmsgs/tsigmatch2.nim | 2 |
4 files changed, 57 insertions, 49 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 diff --git a/tests/concepts/texplain.nim b/tests/concepts/texplain.nim index 344b6d53f..de3d540cd 100644 --- a/tests/concepts/texplain.nim +++ b/tests/concepts/texplain.nim @@ -1,41 +1,45 @@ discard """ cmd: "nim c --verbosity:0 --colors:off $file" nimout: ''' -texplain.nim(158, 10) Hint: Non-matching candidates for e(y) +texplain.nim(164, 10) Hint: Non-matching candidates for e(y) proc e(i: int): int first type mismatch at position: 1 required type for i: int but expression 'y' is of type: MatchingType -texplain.nim(161, 7) Hint: Non-matching candidates for e(10) +texplain.nim(167, 7) Hint: Non-matching candidates for e(10) proc e(o: ExplainedConcept): int first type mismatch at position: 1 required type for o: ExplainedConcept but expression '10' is of type: int literal(10) -texplain.nim(124, 6) ExplainedConcept: undeclared field: 'foo' -texplain.nim(124, 6) ExplainedConcept: undeclared field: '.' -texplain.nim(124, 6) ExplainedConcept: expression '.' cannot be called -texplain.nim(124, 5) ExplainedConcept: concept predicate failed -texplain.nim(125, 6) ExplainedConcept: undeclared field: 'bar' -texplain.nim(125, 6) ExplainedConcept: undeclared field: '.' -texplain.nim(125, 6) ExplainedConcept: expression '.' cannot be called -texplain.nim(124, 5) ExplainedConcept: concept predicate failed - -texplain.nim(164, 10) Hint: Non-matching candidates for e(10) +texplain.nim(130, 6) ExplainedConcept: undeclared field: 'foo' +texplain.nim(130, 6) ExplainedConcept: undeclared field: '.' +texplain.nim(130, 6) ExplainedConcept: expression '.' cannot be called +texplain.nim(130, 6) ExplainedConcept: expression '' has no type (or is ambiguous) +texplain.nim(130, 5) ExplainedConcept: concept predicate failed +texplain.nim(131, 6) ExplainedConcept: undeclared field: 'bar' +texplain.nim(131, 6) ExplainedConcept: undeclared field: '.' +texplain.nim(131, 6) ExplainedConcept: expression '.' cannot be called +texplain.nim(131, 6) ExplainedConcept: expression '' has no type (or is ambiguous) +texplain.nim(130, 5) ExplainedConcept: concept predicate failed + +texplain.nim(170, 10) Hint: Non-matching candidates for e(10) proc e(o: ExplainedConcept): int first type mismatch at position: 1 required type for o: ExplainedConcept but expression '10' is of type: int literal(10) -texplain.nim(124, 6) ExplainedConcept: undeclared field: 'foo' -texplain.nim(124, 6) ExplainedConcept: undeclared field: '.' -texplain.nim(124, 6) ExplainedConcept: expression '.' cannot be called -texplain.nim(124, 5) ExplainedConcept: concept predicate failed -texplain.nim(125, 6) ExplainedConcept: undeclared field: 'bar' -texplain.nim(125, 6) ExplainedConcept: undeclared field: '.' -texplain.nim(125, 6) ExplainedConcept: expression '.' cannot be called -texplain.nim(124, 5) ExplainedConcept: concept predicate failed - -texplain.nim(168, 20) Error: type mismatch: got <NonMatchingType> +texplain.nim(130, 6) ExplainedConcept: undeclared field: 'foo' +texplain.nim(130, 6) ExplainedConcept: undeclared field: '.' +texplain.nim(130, 6) ExplainedConcept: expression '.' cannot be called +texplain.nim(130, 6) ExplainedConcept: expression '' has no type (or is ambiguous) +texplain.nim(130, 5) ExplainedConcept: concept predicate failed +texplain.nim(131, 6) ExplainedConcept: undeclared field: 'bar' +texplain.nim(131, 6) ExplainedConcept: undeclared field: '.' +texplain.nim(131, 6) ExplainedConcept: expression '.' cannot be called +texplain.nim(131, 6) ExplainedConcept: expression '' has no type (or is ambiguous) +texplain.nim(130, 5) ExplainedConcept: concept predicate failed + +texplain.nim(174, 20) Error: type mismatch: got <NonMatchingType> but expected one of: proc e(i: int): int first type mismatch at position: 1 @@ -45,11 +49,11 @@ proc e(o: ExplainedConcept): int first type mismatch at position: 1 required type for o: ExplainedConcept but expression 'n' is of type: NonMatchingType -texplain.nim(168, 9) template/generic instantiation of `assert` from here -texplain.nim(124, 5) ExplainedConcept: concept predicate failed +texplain.nim(174, 9) template/generic instantiation of `assert` from here +texplain.nim(130, 5) ExplainedConcept: concept predicate failed expression: e(n) -texplain.nim(169, 20) Error: type mismatch: got <NonMatchingType> +texplain.nim(175, 20) Error: type mismatch: got <NonMatchingType> but expected one of: proc r(i: string): int first type mismatch at position: 1 @@ -59,15 +63,15 @@ proc r(o: RegularConcept): int first type mismatch at position: 1 required type for o: RegularConcept but expression 'n' is of type: NonMatchingType -texplain.nim(169, 9) template/generic instantiation of `assert` from here -texplain.nim(128, 5) RegularConcept: concept predicate failed +texplain.nim(175, 9) template/generic instantiation of `assert` from here +texplain.nim(134, 5) RegularConcept: concept predicate failed proc r[T](a: SomeNumber; b: T; c: auto) first type mismatch at position: 1 required type for a: SomeNumber but expression 'n' is of type: NonMatchingType expression: r(n) -texplain.nim(170, 20) Hint: Non-matching candidates for r(y) +texplain.nim(176, 20) Hint: Non-matching candidates for r(y) proc r(i: string): int first type mismatch at position: 1 required type for i: string @@ -77,25 +81,27 @@ proc r[T](a: SomeNumber; b: T; c: auto) required type for a: SomeNumber but expression 'y' is of type: MatchingType -texplain.nim(178, 2) Error: type mismatch: got <MatchingType> +texplain.nim(184, 2) Error: type mismatch: got <MatchingType> but expected one of: proc f(o: NestedConcept) first type mismatch at position: 1 required type for o: NestedConcept but expression 'y' is of type: MatchingType -texplain.nim(128, 6) RegularConcept: undeclared field: 'foo' -texplain.nim(128, 6) RegularConcept: undeclared field: '.' -texplain.nim(128, 6) RegularConcept: expression '.' cannot be called -texplain.nim(128, 5) RegularConcept: concept predicate failed -texplain.nim(129, 6) RegularConcept: undeclared field: 'bar' -texplain.nim(129, 6) RegularConcept: undeclared field: '.' -texplain.nim(129, 6) RegularConcept: expression '.' cannot be called -texplain.nim(128, 5) RegularConcept: concept predicate failed -texplain.nim(132, 5) NestedConcept: concept predicate failed +texplain.nim(134, 6) RegularConcept: undeclared field: 'foo' +texplain.nim(134, 6) RegularConcept: undeclared field: '.' +texplain.nim(134, 6) RegularConcept: expression '.' cannot be called +texplain.nim(134, 6) RegularConcept: expression '' has no type (or is ambiguous) +texplain.nim(134, 5) RegularConcept: concept predicate failed +texplain.nim(135, 6) RegularConcept: undeclared field: 'bar' +texplain.nim(135, 6) RegularConcept: undeclared field: '.' +texplain.nim(135, 6) RegularConcept: expression '.' cannot be called +texplain.nim(135, 6) RegularConcept: expression '' has no type (or is ambiguous) +texplain.nim(134, 5) RegularConcept: concept predicate failed +texplain.nim(138, 5) NestedConcept: concept predicate failed expression: f(y)''' errormsg: "type mismatch: got <MatchingType>" - line: 178 + line: 184 """ diff --git a/tests/errmsgs/tsigmatch2.nim b/tests/errmsgs/tsigmatch2.nim index 580743f3e..4996634c9 100644 --- a/tests/errmsgs/tsigmatch2.nim +++ b/tests/errmsgs/tsigmatch2.nim @@ -13,6 +13,7 @@ proc foo(i: Foo): string but expression '1.2' is of type: float64 expression: foo(1.2) +tsigmatch2.nim(40, 14) Error: expression '' has no type (or is ambiguous) tsigmatch2.nim(46, 7) Error: type mismatch: got <int literal(1)> but expected one of: proc foo(args: varargs[string, myproc]) @@ -26,7 +27,6 @@ expression: foo 1 """ - # line 30 type Foo = object block: # issue #13182 |