add type check for default fields (#20652)
This commit is contained in:
parent
064b72a59c
commit
c1343739e1
2 changed files with 32 additions and 2 deletions
|
|
@ -485,6 +485,10 @@ proc semTuple(c: PContext, n: PNode, prev: PType): PType =
|
||||||
var hasDefaultField = a[^1].kind != nkEmpty
|
var hasDefaultField = a[^1].kind != nkEmpty
|
||||||
if hasDefaultField:
|
if hasDefaultField:
|
||||||
a[^1] = semConstExpr(c, a[^1])
|
a[^1] = semConstExpr(c, a[^1])
|
||||||
|
if a[^2].kind != nkEmpty:
|
||||||
|
typ = semTypeNode(c, a[^2], nil)
|
||||||
|
typ = fitNodeConsiderViewType(c, typ, a[^1], a[^1].info).typ
|
||||||
|
else:
|
||||||
typ = a[^1].typ
|
typ = a[^1].typ
|
||||||
elif a[^2].kind != nkEmpty:
|
elif a[^2].kind != nkEmpty:
|
||||||
typ = semTypeNode(c, a[^2], nil)
|
typ = semTypeNode(c, a[^2], nil)
|
||||||
|
|
@ -820,6 +824,10 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int,
|
||||||
var hasDefaultField = n[^1].kind != nkEmpty
|
var hasDefaultField = n[^1].kind != nkEmpty
|
||||||
if hasDefaultField:
|
if hasDefaultField:
|
||||||
n[^1] = semConstExpr(c, n[^1])
|
n[^1] = semConstExpr(c, n[^1])
|
||||||
|
if n[^2].kind != nkEmpty:
|
||||||
|
typ = semTypeNode(c, n[^2], nil)
|
||||||
|
typ = fitNodeConsiderViewType(c, typ, n[^1], n[^1].info).typ
|
||||||
|
else:
|
||||||
typ = n[^1].typ
|
typ = n[^1].typ
|
||||||
propagateToOwner(rectype, typ)
|
propagateToOwner(rectype, typ)
|
||||||
elif n[^2].kind == nkEmpty:
|
elif n[^2].kind == nkEmpty:
|
||||||
|
|
|
||||||
22
tests/objects/tdefaultfieldscheck.nim
Normal file
22
tests/objects/tdefaultfieldscheck.nim
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
discard """
|
||||||
|
cmd: "nim check --hints:off $file"
|
||||||
|
errormsg: ""
|
||||||
|
nimout:
|
||||||
|
'''
|
||||||
|
tdefaultfieldscheck.nim(17, 17) Error: type mismatch: got <string> but expected 'int'
|
||||||
|
tdefaultfieldscheck.nim(18, 20) Error: type mismatch: got <int literal(12)> but expected 'string'
|
||||||
|
tdefaultfieldscheck.nim(20, 16) Error: type mismatch: got <float64> but expected 'int'
|
||||||
|
tdefaultfieldscheck.nim(17, 5) Error: type mismatch: got <string> but expected 'int'
|
||||||
|
tdefaultfieldscheck.nim(18, 5) Error: type mismatch: got <int literal(12)> but expected 'string'
|
||||||
|
tdefaultfieldscheck.nim(20, 5) Error: type mismatch: got <float64> but expected 'int'
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
type
|
||||||
|
Date* = object
|
||||||
|
name: int = "string"
|
||||||
|
time: string = 12
|
||||||
|
goal: float = 7
|
||||||
|
fun: int = 1.4
|
||||||
|
|
||||||
|
echo default(Date)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue