diff --git a/compiler/ast.nim b/compiler/ast.nim index 5ff986776c3e..2f6c272320ea 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -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 diff --git a/tests/metatype/ttypetraits.nim b/tests/metatype/ttypetraits.nim index 0523390a760c..74ace75c3acd 100644 --- a/tests/metatype/ttypetraits.nim +++ b/tests/metatype/ttypetraits.nim @@ -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]])