diff options
author | flywind <43030857+xflywind@users.noreply.github.com> | 2021-01-11 08:07:48 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-11 15:07:48 +0100 |
commit | aa185c0e9b4904b305496bd1f83cbbadf2fbfa36 (patch) | |
tree | 3ecb497224682212ace87949baa650f359a806db | |
parent | be6e8916faa51d227d51e1291d1f24751385b010 (diff) | |
download | Nim-aa185c0e9b4904b305496bd1f83cbbadf2fbfa36.tar.gz |
fix #13517 (#16681)
-rw-r--r-- | compiler/vm.nim | 6 | ||||
-rw-r--r-- | tests/distinct/tdistinct_issues.nim | 14 |
2 files changed, 17 insertions, 3 deletions
diff --git a/compiler/vm.nim b/compiler/vm.nim index b8df456e0..00f0aca7c 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -429,13 +429,13 @@ proc opConv(c: PCtx; dest: var TFullReg, src: TFullReg, desttyp, srctyp: PType): return true of tyUInt..tyUInt64: dest.ensureKind(rkInt) - case skipTypes(srctyp, abstractRange).kind + let styp = srctyp.skipTypes(abstractRange) # skip distinct types(dest type could do this too if needed) + case styp.kind of tyFloat..tyFloat64: dest.intVal = int(src.floatVal) else: - let srcDist = (sizeof(src.intVal) - srctyp.size) * 8 + let srcDist = (sizeof(src.intVal) - styp.size) * 8 let destDist = (sizeof(dest.intVal) - desttyp.size) * 8 - var value = cast[BiggestUInt](src.intVal) value = (value shl srcDist) shr srcDist value = (value shl destDist) shr destDist diff --git a/tests/distinct/tdistinct_issues.nim b/tests/distinct/tdistinct_issues.nim index ce71344d0..747cf0b8d 100644 --- a/tests/distinct/tdistinct_issues.nim +++ b/tests/distinct/tdistinct_issues.nim @@ -65,3 +65,17 @@ block t9322: proc mystr(s: string) = echo s mystr($Fix("apr")) + + +block: # bug #13517 + type MyUint64 = distinct uint64 + + proc `==`(a: MyUint64, b: uint64): bool = uint64(a) == b + + block: + doAssert MyUint64.high is MyUint64 + doAssert MyUint64.high == 18446744073709551615'u64 + + static: + doAssert MyUint64.high is MyUint64 + doAssert MyUint64.high == 18446744073709551615'u64 |