diff options
-rw-r--r-- | compiler/semmagic.nim | 3 | ||||
-rw-r--r-- | lib/system/repr_v2.nim | 7 | ||||
-rw-r--r-- | tests/metatype/tmetatype_various.nim | 1 |
3 files changed, 10 insertions, 1 deletions
diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim index d3e12670b..a6832de50 100644 --- a/compiler/semmagic.nim +++ b/compiler/semmagic.nim @@ -190,6 +190,9 @@ proc evalTypeTrait(c: PContext; traitCall: PNode, operand: PType, context: PSym) arg = arg.base.skipTypes(skippedTypes + {tyGenericInst}) if not rec: break result = getTypeDescNode(c, arg, operand.owner, traitCall.info) + of "skipRanges": + var arg = operand.skipTypes({tyRange}) + result = getTypeDescNode(c, arg, operand.owner, traitCall.info) else: localError(c.config, traitCall.info, "unknown trait: " & s) result = newNodeI(nkEmpty, traitCall.info) diff --git a/lib/system/repr_v2.nim b/lib/system/repr_v2.nim index 0e9bec0f3..d87e07b7e 100644 --- a/lib/system/repr_v2.nim +++ b/lib/system/repr_v2.nim @@ -9,6 +9,8 @@ proc isNamedTuple(T: typedesc): bool {.magic: "TypeTrait".} proc distinctBase(T: typedesc, recursive: static bool = true): typedesc {.magic: "TypeTrait".} ## imported from typetraits +proc skipRanges(T: typedesc): typedesc {.magic: "TypeTrait".} + proc repr*(x: NimNode): string {.magic: "Repr", noSideEffect.} proc repr*(x: int): string = @@ -96,7 +98,10 @@ proc repr*(p: proc): string = repr(cast[ptr pointer](unsafeAddr p)[]) template repr*(x: distinct): string = - repr(distinctBase(typeof(x))(x)) + when x is range: # hacks for ranges with distinct sub types + repr(distinctBase(skipRanges(typeof(x)))(x)) + else: + repr(distinctBase(typeof(x))(x)) template repr*(t: typedesc): string = $t diff --git a/tests/metatype/tmetatype_various.nim b/tests/metatype/tmetatype_various.nim index 9faeeec4a..30169aa1e 100644 --- a/tests/metatype/tmetatype_various.nim +++ b/tests/metatype/tmetatype_various.nim @@ -1,4 +1,5 @@ discard """ + matrix: "--mm:refc; --mm:orc" output: '''[1, 0, 0, 0, 0, 0, 0, 0] CTBool[Ct[system.uint32]]''' """ |