Skip to content

Commit

Permalink
fixes #24378; supportsCopyMem can fail from macro context with tuples (
Browse files Browse the repository at this point in the history
…#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)`
  • Loading branch information
ringabout authored Oct 30, 2024
1 parent 74df699 commit 5e56f0a
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/ast.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
27 changes: 27 additions & 0 deletions tests/metatype/ttypetraits.nim
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
discard """
joinable: false
"""

import typetraits
import macros

Expand Down Expand Up @@ -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]])

0 comments on commit 5e56f0a

Please sign in to comment.