fixes #24378; supportsCopyMem can fail from macro context with tuples (#24383)

fixes #24378

```nim
type Win = typeof(`body`)
doAssert not supportsCopyMem((int, Win))
```

`semAfterMacroCall` doesn't skip the children aliases types in the tuple
typedesc construction while the normal program seem to skip the aliases
types somewhere

`(int, Win)` is kept as `(int, alias string)` instead of expected `(int,
string)`
This commit is contained in:
ringabout
2024-10-31 05:58:39 +08:00
committed by GitHub
parent 74df699ff1
commit 5e56f0a356
2 changed files with 28 additions and 1 deletions

View File

@@ -1645,7 +1645,7 @@ proc propagateToOwner*(owner, elem: PType; propagateHasAsgn = true) =
if mask != {} and propagateHasAsgn:
let o2 = owner.skipTypes({tyGenericInst, tyAlias, tySink})
if o2.kind in {tyTuple, tyObject, tyArray,
tySequence, tySet, tyDistinct}:
tySequence, tyString, tySet, tyDistinct}:
o2.flags.incl mask
owner.flags.incl mask

View File

@@ -1,3 +1,7 @@
discard """
joinable: false
"""
import typetraits
import macros
@@ -402,3 +406,26 @@ when true: # Odd bug where alias can seep inside of `distinctBase`
proc `$`*[T: AdtChild](adtChild: T): string = ""
check 10 is int
block: # bug #24378
macro forked(body: typed): untyped = # typed or untyped does not matter
result = quote do:
type Win = typeof(`body`)
doAssert not supportsCopyMem((int, Win))
doAssert not supportsCopyMem(tuple[a: int, b: Win])
type Win2[T] = typeof(`body`)
doAssert not supportsCopyMem((int, Win2[int]))
doAssert not supportsCopyMem(tuple[a: int, b: Win2[int]])
forked:
"foobar"
type Win111 = typeof("foobar")
doAssert not supportsCopyMem((int, Win111))
doAssert not supportsCopyMem(tuple[a: int, b: Win111])
type Win222[T] = typeof("foobar")
doAssert not supportsCopyMem((int, Win222[int]))
doAssert not supportsCopyMem(tuple[a: int, b: Win222[int]])