Skip to content

Commit

Permalink
fixes nim-lang#20695; fixes object with distinct defaults and tables (n…
Browse files Browse the repository at this point in the history
  • Loading branch information
ringabout authored and bung87 committed Jul 29, 2023
1 parent 090a498 commit 7ccb28e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
4 changes: 3 additions & 1 deletion compiler/semtypes.nim
Expand Up @@ -222,9 +222,11 @@ proc isRecursiveType(t: PType, cycleDetector: var IntSet): bool =

proc fitDefaultNode(c: PContext, n: PNode): PType =
let expectedType = if n[^2].kind != nkEmpty: semTypeNode(c, n[^2], nil) else: nil
let oldType = n[^1].typ
n[^1] = semConstExpr(c, n[^1], expectedType = expectedType)
n[^1].flags.incl nfSem
if n[^2].kind != nkEmpty:
if expectedType != nil:
if expectedType != nil and oldType != expectedType:
n[^1] = fitNodeConsiderViewType(c, expectedType, n[^1], n[^1].info)
result = n[^1].typ
else:
Expand Down
39 changes: 38 additions & 1 deletion tests/objects/tobject_default_value.nim
Expand Up @@ -3,7 +3,7 @@ discard """
targets: "c cpp js"
"""

import std/[times, macros]
import std/[times, macros, tables]

type
Guess = object
Expand Down Expand Up @@ -236,6 +236,7 @@ template main {.dirty.} =
doAssert x.obj.name.scale == 1

when nimvm:
# todo
discard "fixme"
else:
when defined(gcArc) or defined(gcOrc):
Expand Down Expand Up @@ -523,5 +524,41 @@ template main {.dirty.} =

discard oToEither(O())

block: # bug #20695
type
Default = object
tabs: Table[string, int] = initTable[string, int]()

let d = default(Default)
doAssert d.tabs.len == 0

block:
type
Default = object
tabs: Table[string, int] = Table[string, int]()

let d = default(Default)
doAssert d.tabs.len == 0


block:
type DjangoDateTime = distinct DateTime

type Default = object
data: DjangoDateTime = DjangoDateTime(DateTime())

let x = default(Default)
doAssert x.data is DjangoDateTime

block:
type DjangoDateTime = distinct DateTime

type Default = object
data = DjangoDateTime(DateTime())

let x = default(Default)
doAssert x.data is DjangoDateTime


static: main()
main()

0 comments on commit 7ccb28e

Please sign in to comment.