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
2 changes: 1 addition & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@

## Compiler changes

- Added `--declaredlocs` to show symbol declaration location in messages.
- Added `--declaredLocs` to show symbol declaration location in messages.

- You can now enable/disable VM tracing in user code via `vmutils.vmTrace`.

Expand Down
2 changes: 1 addition & 1 deletion compiler/astmsgs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ proc addDeclaredLoc*(result: var string, conf: ConfigRef; typ: PType) =
# xxx figure out how to resolve `tyGenericParam`, e.g. for
# proc fn[T](a: T, b: T) = discard
# fn(1.1, "a")
let typ = typ.skipTypes(abstractInst + {tyStatic, tyUserTypeClassInst} - {tyRange})
let typ = typ.skipTypes(abstractInst + {tyStatic, tySequence, tyArray, tySet, tyUserTypeClassInst, tyVar, tyRef, tyPtr} - {tyRange})
result.add " [$1" % typ.kind.toHumanStr
if typ.sym != nil:
result.add " declared in " & toFileLineCol(conf, typ.sym.info)
Expand Down
12 changes: 5 additions & 7 deletions compiler/semcall.nim
Original file line number Diff line number Diff line change
Expand Up @@ -231,21 +231,19 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):
of kMissingParam: candidates.add("\n missing parameter: " & nameParam)
of kTypeMismatch, kVarNeeded:
doAssert nArg != nil
var wanted = err.firstMismatch.formal.typ
let wanted = err.firstMismatch.formal.typ
doAssert err.firstMismatch.formal != nil
candidates.add("\n required type for " & nameParam & ": ")
candidates.add typeToString(wanted)
candidates.addDeclaredLocMaybe(c.config, wanted)
candidates.addTypeDeclVerboseMaybe(c.config, wanted)
candidates.add "\n but expression '"
if err.firstMismatch.kind == kVarNeeded:
candidates.add renderNotLValue(nArg)
candidates.add "' is immutable, not 'var'"
else:
candidates.add renderTree(nArg)
candidates.add "' is of type: "
var got = nArg.typ
candidates.add typeToString(got)
candidates.addDeclaredLocMaybe(c.config, got)
let got = nArg.typ
candidates.addTypeDeclVerboseMaybe(c.config, got)
doAssert wanted != nil
if got != nil:
if got.kind == tyProc and wanted.kind == tyProc:
Expand Down Expand Up @@ -274,7 +272,7 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors):

const
errTypeMismatch = "type mismatch: got <"
errButExpected = "but expected one of: "
errButExpected = "but expected one of:"
errUndeclaredField = "undeclared field: '$1'"
errUndeclaredRoutine = "attempting to call undeclared routine: '$1'"
errBadRoutine = "attempting to call routine: '$1'$2"
Expand Down
2 changes: 1 addition & 1 deletion compiler/semexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -988,7 +988,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags): PNode =
break
if not hasErrorType:
let typ = n[0].typ
msg.add(">\nbut expected one of: \n" &
msg.add(">\nbut expected one of:\n" &
typeToString(typ))
# prefer notin preferToResolveSymbols
# t.sym != nil
Expand Down
8 changes: 8 additions & 0 deletions compiler/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ type
pcmDifferentCallConv

proc typeToString*(typ: PType; prefer: TPreferedDesc = preferName): string

proc addTypeDeclVerboseMaybe*(result: var string, conf: ConfigRef; typ: PType) =
if optDeclaredLocs in conf.globalOptions:
result.add typeToString(typ, preferMixed)
result.addDeclaredLoc(conf, typ)
else:
result.add typeToString(typ)

template `$`*(typ: PType): string = typeToString(typ)

proc base*(t: PType): PType =
Expand Down
92 changes: 92 additions & 0 deletions tests/errmsgs/tdeclaredlocs.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
discard """
action: reject
matrix: "--declaredLocs --hints:off"
nimoutFull: true
nimout: '''
tdeclaredlocs.nim(92, 3) Error: type mismatch: got <seq[MyInt2]>
but expected one of:
proc fn(a: Bam) [proc declared in tdeclaredlocs.nim(86, 6)]
first type mismatch at position: 1
required type for a: Bam [object declared in tdeclaredlocs.nim(78, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: Goo[MyInt2]) [proc declared in tdeclaredlocs.nim(89, 6)]
first type mismatch at position: 1
required type for a: Goo[MyInt2{char}] [object declared in tdeclaredlocs.nim(79, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: Goo[cint]) [proc declared in tdeclaredlocs.nim(88, 6)]
first type mismatch at position: 1
required type for a: Goo[cint{int32}] [object declared in tdeclaredlocs.nim(79, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: array[3, Bar]) [proc declared in tdeclaredlocs.nim(82, 6)]
first type mismatch at position: 1
required type for a: array[0..2, Bar] [object declared in tdeclaredlocs.nim(74, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: seq[Bar]) [proc declared in tdeclaredlocs.nim(81, 6)]
first type mismatch at position: 1
required type for a: seq[Bar] [object declared in tdeclaredlocs.nim(74, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: seq[MyInt1]) [proc declared in tdeclaredlocs.nim(80, 6)]
first type mismatch at position: 1
required type for a: seq[MyInt1{int}] [int declared in tdeclaredlocs.nim(72, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: set[Baz]) [proc declared in tdeclaredlocs.nim(84, 6)]
first type mismatch at position: 1
required type for a: set[Baz{enum}] [enum declared in tdeclaredlocs.nim(75, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: set[MyInt2]) [proc declared in tdeclaredlocs.nim(83, 6)]
first type mismatch at position: 1
required type for a: set[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: var SetBaz) [proc declared in tdeclaredlocs.nim(85, 6)]
first type mismatch at position: 1
required type for a: var SetBaz [enum declared in tdeclaredlocs.nim(75, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]
proc fn(a: var ref ptr Bam) [proc declared in tdeclaredlocs.nim(87, 6)]
first type mismatch at position: 1
required type for a: var ref ptr Bam [object declared in tdeclaredlocs.nim(78, 3)]
but expression 'a' is of type: seq[MyInt2{char}] [char declared in tdeclaredlocs.nim(73, 3)]

expression: fn(a)
'''
"""

#[
see also: tests/errmsgs/tsigmatch.nim
]#














# line 70
type
MyInt1 = int
MyInt2 = char
Bar = object
Baz = enum k0, k1
Baz2 = Baz
SetBaz = set[Baz2]
Bam = ref object
Goo[T] = object
proc fn(a: seq[MyInt1]) = discard
proc fn(a: seq[Bar]) = discard
proc fn(a: array[3, Bar]) = discard
proc fn(a: set[MyInt2]) = discard
proc fn(a: set[Baz]) = discard
proc fn(a: var SetBaz) = discard
proc fn(a: Bam) = discard
proc fn(a: var ref ptr Bam) = discard
proc fn(a: Goo[cint]) = discard
proc fn(a: Goo[MyInt2]) = discard

var a: seq[MyInt2]
fn(a)
2 changes: 1 addition & 1 deletion tests/errmsgs/tproc_mismatch.nim
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ discard """
tproc_mismatch.nim(35, 52) Error: type mismatch: got <proc (a: int, c: float){.cdecl, noSideEffect, gcsafe, locks: 0.}> but expected 'proc (a: int, c: float){.closure, noSideEffect.}'
Calling convention mismatch: got '{.cdecl.}', but expected '{.closure.}'.
tproc_mismatch.nim(39, 6) Error: type mismatch: got <proc (){.inline, noSideEffect, gcsafe, locks: 0.}>
but expected one of:
but expected one of:
proc bar(a: proc ())
first type mismatch at position: 1
required type for a: proc (){.closure.}
Expand Down
6 changes: 3 additions & 3 deletions tests/errmsgs/tsigmatch.nim
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,9 @@ expression: fun1(default(Mystring), "asdf")






#[
see also: tests/errmsgs/tdeclaredlocs.nim
]#



Expand Down