summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2022-10-25 13:39:57 +0800
committerGitHub <noreply@github.com>2022-10-25 07:39:57 +0200
commitc1343739e15eb2b225d8a523d577c0bc84148ad9 (patch)
treee832212c6351f2884358a511b5dea04e3b226e40
parent064b72a59c6ed61939fc89f91f4311ac60a6ec45 (diff)
downloadNim-c1343739e15eb2b225d8a523d577c0bc84148ad9.tar.gz
add type check for default fields (#20652)
-rw-r--r--compiler/semtypes.nim12
-rw-r--r--tests/objects/tdefaultfieldscheck.nim22
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