diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2022-10-25 13:39:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-25 07:39:57 +0200 |
commit | c1343739e15eb2b225d8a523d577c0bc84148ad9 (patch) | |
tree | e832212c6351f2884358a511b5dea04e3b226e40 | |
parent | 064b72a59c6ed61939fc89f91f4311ac60a6ec45 (diff) | |
download | Nim-c1343739e15eb2b225d8a523d577c0bc84148ad9.tar.gz |
add type check for default fields (#20652)
-rw-r--r-- | compiler/semtypes.nim | 12 | ||||
-rw-r--r-- | tests/objects/tdefaultfieldscheck.nim | 22 |
2 files changed, 32 insertions, 2 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index e254965c9..e4f63a217 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -485,7 +485,11 @@ proc semTuple(c: PContext, n: PNode, prev: PType): PType = var hasDefaultField = a[^1].kind != nkEmpty if hasDefaultField: a[^1] = semConstExpr(c, a[^1]) - typ = a[^1].typ + 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 elif a[^2].kind != nkEmpty: typ = semTypeNode(c, a[^2], nil) if c.graph.config.isDefined("nimPreviewRangeDefault") and typ.skipTypes(abstractInst).kind == tyRange: @@ -820,7 +824,11 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int, var hasDefaultField = n[^1].kind != nkEmpty if hasDefaultField: n[^1] = semConstExpr(c, n[^1]) - typ = n[^1].typ + 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 propagateToOwner(rectype, typ) elif n[^2].kind == nkEmpty: localError(c.config, n.info, errTypeExpected) diff --git a/tests/objects/tdefaultfieldscheck.nim b/tests/objects/tdefaultfieldscheck.nim new file mode 100644 index 000000000..9c648ed2b --- /dev/null +++ b/tests/objects/tdefaultfieldscheck.nim @@ -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) \ No newline at end of file |