fixes #20695; fixes object with distinct defaults and tables (#21428)

This commit is contained in:
ringabout
2023-02-24 16:02:44 +08:00
committed by GitHub
parent 8a19ac2070
commit bbb6d2c69d
2 changed files with 41 additions and 2 deletions

View File

@@ -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:

View File

@@ -3,7 +3,7 @@ discard """
targets: "c cpp js"
"""
import std/[times, macros]
import std/[times, macros, tables]
type
Guess = object
@@ -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):
@@ -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()