summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semmagic.nim3
-rw-r--r--tests/metatype/ttypetraits.nim20
2 files changed, 23 insertions, 0 deletions
diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim
index 3b329c50c..0cd5a5332 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 8ae41f1e6..dfd22b418 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