Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions compiler/semcall.nim
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
## This module implements semantic checking for calls.
# included from sem.nim

from algorithm import sort

proc sameMethodDispatcher(a, b: PSym): bool =
result = false
if a.kind == skMethod and b.kind == skMethod:
Expand Down Expand Up @@ -178,9 +180,11 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):

var maybeWrongSpace = false

var candidatesAll: seq[string]
var candidates = ""
var skipped = 0
for err in errors:
candidates.setLen 0
if filterOnlyFirst and err.firstMismatch.arg == 1:
inc skipped
continue
Expand Down Expand Up @@ -225,6 +229,9 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):
maybeWrongSpace = true
for diag in err.diagnostics:
candidates.add(diag & "\n")
candidatesAll.add candidates
candidatesAll.sort # fix #13538
candidates = join(candidatesAll)
if skipped > 0:
candidates.add($skipped & " other mismatching symbols have been " &
"suppressed; compile with --showAllMismatches:on to see them\n")
Expand Down
34 changes: 17 additions & 17 deletions tests/concepts/t3330.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
discard """
errormsg: "type mismatch: got <Bar[system.int]>"
disabled: "32bit"
nimout: '''
t3330.nim(78, 4) Error: type mismatch: got <Bar[system.int]>
but expected one of:
Expand All @@ -9,33 +8,33 @@ proc test(foo: Foo[int])
required type for foo: Foo[int]
but expression 'bar' is of type: Bar[system.int]
t3330.nim(63, 8) Hint: Non-matching candidates for add(k, string, T)
proc add(x: var string; y: string)
first type mismatch at position: 1
required type for x: var string
but expression 'k' is of type: Alias
proc add[T](x: var seq[T]; y: openArray[T])
proc add(result: var string; x: float)
first type mismatch at position: 1
required type for x: var seq[T]
required type for result: var string
but expression 'k' is of type: Alias
proc add(result: var string; x: float)
proc add(result: var string; x: int64)
first type mismatch at position: 1
required type for result: var string
but expression 'k' is of type: Alias
proc add[T](x: var seq[T]; y: T)
proc add(x: var string; y: char)
first type mismatch at position: 1
required type for x: var seq[T]
required type for x: var string
but expression 'k' is of type: Alias
proc add(x: var string; y: cstring)
first type mismatch at position: 1
required type for x: var string
but expression 'k' is of type: Alias
proc add(x: var string; y: char)
proc add(x: var string; y: string)
first type mismatch at position: 1
required type for x: var string
but expression 'k' is of type: Alias
proc add(result: var string; x: int64)
proc add[T](x: var seq[T]; y: T)
first type mismatch at position: 1
required type for result: var string
required type for x: var seq[T]
but expression 'k' is of type: Alias
proc add[T](x: var seq[T]; y: openArray[T])
first type mismatch at position: 1
required type for x: var seq[T]
but expression 'k' is of type: Alias

t3330.nim(63, 8) template/generic instantiation of `add` from here
Expand All @@ -46,10 +45,11 @@ t3330.nim(71, 6) Foo: 'bar.x' cannot be assigned to
expression: test(bar)'''
"""

# Note: currently disabled on 32bit because the candidates are presented in
# different order on travis with `NIM_COMPILE_TO_CPP=false CPU=i386`;
# a possible fix would be to sort the candidates by proc signature or
# declaration location








Expand Down
28 changes: 14 additions & 14 deletions tests/concepts/texplain.nim
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,24 @@ texplain.nim(124, 5) ExplainedConcept: concept predicate failed

texplain.nim(168, 20) Error: type mismatch: got <NonMatchingType>
but expected one of:
proc e(i: int): int
first type mismatch at position: 1
required type for i: int
but expression 'n' is of type: NonMatchingType
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
proc e(i: int): int
first type mismatch at position: 1
required type for i: int
but expression 'n' is of type: NonMatchingType

expression: e(n)
texplain.nim(169, 20) Error: type mismatch: got <NonMatchingType>
but expected one of:
proc r(i: string): int
first type mismatch at position: 1
required type for i: string
but expression 'n' is of type: NonMatchingType
proc r(o: RegularConcept): int
first type mismatch at position: 1
required type for o: RegularConcept
Expand All @@ -61,21 +65,17 @@ 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
proc r(i: string): int
first type mismatch at position: 1
required type for i: string
but expression 'n' is of type: NonMatchingType

expression: r(n)
texplain.nim(170, 20) Hint: Non-matching candidates for r(y)
proc r[T](a: SomeNumber; b: T; c: auto)
first type mismatch at position: 1
required type for a: SomeNumber
but expression 'y' is of type: MatchingType
proc r(i: string): int
first type mismatch at position: 1
required type for i: string
but expression 'y' is of type: MatchingType
proc r[T](a: SomeNumber; b: T; c: auto)
first type mismatch at position: 1
required type for a: SomeNumber
but expression 'y' is of type: MatchingType

texplain.nim(178, 2) Error: type mismatch: got <MatchingType>
but expected one of:
Expand All @@ -97,10 +97,10 @@ expression: f(y)'''
errormsg: "type mismatch: got <MatchingType>"
line: 178

disabled: 32bit
"""

# disabled on 32 bit, because the order of suggested alternatives ``r`` differs


# proc r[T](a: SomeNumber; b: T; c: auto)
# proc r(i: string): int
# proc r(o: RegularConcept): int
Expand Down
14 changes: 7 additions & 7 deletions tests/errmsgs/tsigmatch.nim
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ discard """
nimout: '''
tsigmatch.nim(111, 4) Error: type mismatch: got <A, string>
but expected one of:
proc f(a: A)
first type mismatch at position: 2
extra argument given
proc f(b: B)
first type mismatch at position: 1
required type for b: B
but expression 'A()' is of type: A
proc f(a: A)
first type mismatch at position: 2
extra argument given

expression: f(A(), "extra")
tsigmatch.nim(125, 6) Error: type mismatch: got <tuple of (string, proc (){.gcsafe, locks: 0.})>
Expand Down Expand Up @@ -61,14 +61,14 @@ proc f(a1: string; a2: varargs[string]; a3: float; a4: var string)
expression: f("asdf", "1", "2", "3", "4", 2.3, "bad")
tsigmatch.nim(164, 4) Error: type mismatch: got <string, a0: int literal(12)>
but expected one of:
proc f(x: string; a0: var int)
first type mismatch at position: 2
required type for a0: var int
but expression 'a0 = 12' is immutable, not 'var'
proc f(x: string; a0: string)
first type mismatch at position: 2
required type for a0: string
but expression 'a0 = 12' is of type: int literal(12)
proc f(x: string; a0: var int)
first type mismatch at position: 2
required type for a0: var int
but expression 'a0 = 12' is immutable, not 'var'

expression: f(foo, a0 = 12)
tsigmatch.nim(171, 7) Error: type mismatch: got <Mystring, string>
Expand Down
8 changes: 4 additions & 4 deletions tests/errmsgs/tsigmatch2.nim
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ discard """
nimout: '''
tsigmatch2.nim(40, 14) Error: type mismatch: got <float64>
but expected one of:
proc foo(i: Foo): string
first type mismatch at position: 1
required type for i: Foo
but expression '1.2' is of type: float64
proc foo(args: varargs[string, myproc]): string
first type mismatch at position: 1
required type for args: varargs[string]
but expression '1.2' is of type: float64
proc foo(i: Foo): string
first type mismatch at position: 1
required type for i: Foo
but expression '1.2' is of type: float64

expression: foo(1.2)
tsigmatch2.nim(46, 7) Error: type mismatch: got <int literal(1)>
Expand Down
10 changes: 5 additions & 5 deletions tests/errmsgs/tunknown_named_parameter.nim
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,22 @@ proc rsplit(s: string; sep: char; maxsplit: int = -1): seq[string]
first type mismatch at position: 2
required type for sep: char
but expression '{':'}' is of type: set[char]
proc rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[string]
first type mismatch at position: 3
unknown named parameter: maxsplits
proc rsplit(s: string; sep: string; maxsplit: int = -1): seq[string]
first type mismatch at position: 2
required type for sep: string
but expression '{':'}' is of type: set[char]
proc rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[string]
first type mismatch at position: 3
unknown named parameter: maxsplits

expression: rsplit("abc:def", {':'}, maxsplits = 1)
'''
disabled: 32bit
"""


# bug #8043

# disabled on 32 bit systems because the order of suggested proc alternatives is different.


import strutils
"abc:def".rsplit({':'}, maxsplits = 1)