Files
Nim/tests/proc/twrongdefaultvalue.nim
metagn 446501b53b fix error messages for wrongly typed generic param default values (#24006)
fixes #21258

When a generic proc is instantiated, if one of the default values
doesn't match the type of the parameter, `seminst` sets the default
parameter node to an `nkEmpty` node with `tyError` type. `sigmatch`
checks for this to give an error message if the default param is
actually used, but only while actively matching the proc signature,
before the proc is even instantiated. The error message also gives very
little information.

Now, we check for this in `updateDefaultParams` at the end of
`semResolvedCall`, after the proc has been instantiated. The `nkEmpty`
node also is given the original mismatching type instead rather than
`tyError`, only setting `tyError` after erroring to prevent cascading
errors. The error message is changed to the standard type mismatch error
also giving the instantiation info of the routine.
2024-08-23 18:01:43 +02:00

26 lines
808 B
Nim

discard """
cmd: "nim check $file"
action: reject
nimout: '''
twrongdefaultvalue.nim(20, 12) template/generic instantiation of `doit` from here
twrongdefaultvalue.nim(17, 37) Error: type mismatch: got <proc (p: int): Item[initItem.T]> but expected 'Item[system.string]'
twrongdefaultvalue.nim(25, 3) template/generic instantiation of `foo` from here
twrongdefaultvalue.nim(23, 33) Error: type mismatch: got <string> but expected 'int'
'''
"""
block: # issue #21258
type Item[T] = object
pos: int
proc initItem[T](p:int=10000) : Item[T] =
result = Item[T](p)
proc doit[T](x:Item[T], s:Item[T]=initItem) : string =
return $x.pos
let x = Item[string](pos:100)
echo doit(x)
block: # issue #21258, reduced case
proc foo[T](x: seq[T], y: T = "foo") =
discard
foo @[1, 2, 3]