diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim index 3b329c50c980f..0cd5a5332582f 100644 --- a/compiler/semmagic.nim +++ b/compiler/semmagic.nim @@ -133,6 +133,9 @@ proc evalTypeTrait(c: PContext; traitCall: PNode, operand: PType, context: PSym) template typeWithSonsResult(kind, sons): PNode = newTypeWithSons(context, kind, sons).toNode(traitCall.info) + if operand.kind == tyGenericParam or (traitCall.len > 2 and operand2.kind == tyGenericParam): + return traitCall ## tpo early to evaluate + let s = trait.sym.name.s case s of "or", "|": diff --git a/tests/metatype/ttypetraits.nim b/tests/metatype/ttypetraits.nim index 8ae41f1e6e484..dfd22b4183e08 100644 --- a/tests/metatype/ttypetraits.nim +++ b/tests/metatype/ttypetraits.nim @@ -101,3 +101,23 @@ block genericParams: static: doAssert (int, float).lenTuple == 2 static: doAssert (1, ).lenTuple == 1 static: doAssert ().lenTuple == 0 + + +############################################## +# bug 13095 + +type + CpuStorage{.shallow.}[T] = ref object + when supportsCopyMem(T): + raw_buffer*: ptr UncheckedArray[T] # 8 bytes + memalloc*: pointer # 8 bytes + isMemOwner*: bool # 1 byte + else: # Tensors of strings, other ref types or non-trivial destructors + raw_buffer*: seq[T] # 8 bytes (16 for seq v2 backed by destructors?) + +var x = CpuStorage[string]() + +static: + doAssert(not string.supportsCopyMem) + doAssert x.T is string # true + doAssert x.raw_buffer is seq \ No newline at end of file