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
commit bbb6d2c69d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
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 = proc fitDefaultNode(c: PContext, n: PNode): PType =
let expectedType = if n[^2].kind != nkEmpty: semTypeNode(c, n[^2], nil) else: nil 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] = semConstExpr(c, n[^1], expectedType = expectedType)
n[^1].flags.incl nfSem
if n[^2].kind != nkEmpty: if n[^2].kind != nkEmpty:
if expectedType != nil: if expectedType != nil and oldType != expectedType:
n[^1] = fitNodeConsiderViewType(c, expectedType, n[^1], n[^1].info) n[^1] = fitNodeConsiderViewType(c, expectedType, n[^1], n[^1].info)
result = n[^1].typ result = n[^1].typ
else: else:

View file

@ -3,7 +3,7 @@ discard """
targets: "c cpp js" targets: "c cpp js"
""" """
import std/[times, macros] import std/[times, macros, tables]
type type
Guess = object Guess = object
@ -236,6 +236,7 @@ template main {.dirty.} =
doAssert x.obj.name.scale == 1 doAssert x.obj.name.scale == 1
when nimvm: when nimvm:
# todo
discard "fixme" discard "fixme"
else: else:
when defined(gcArc) or defined(gcOrc): when defined(gcArc) or defined(gcOrc):
@ -523,5 +524,41 @@ template main {.dirty.} =
discard oToEither(O()) 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() static: main()
main() main()