diff options
author | cooldome <ariabushenko@bk.ru> | 2018-06-10 23:27:45 +0100 |
---|---|---|
committer | cooldome <ariabushenko@bk.ru> | 2018-06-10 23:27:45 +0100 |
commit | a65e9c0e2520911d16b81e7af47fea8c3fdd2958 (patch) | |
tree | 394894bbdf96fdffffd7328ca8194391d9e567c5 | |
parent | 4d87d666ee12d9a16a0a3b21ab30b46f9e933cb0 (diff) | |
download | Nim-a65e9c0e2520911d16b81e7af47fea8c3fdd2958.tar.gz |
fix comments
-rw-r--r-- | compiler/sigmatch.nim | 27 | ||||
-rw-r--r-- | compiler/types.nim | 48 |
2 files changed, 52 insertions, 23 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index ec13b7557..bdae01d7d 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -633,26 +633,21 @@ proc procTypeRel(c: var TCandidate, f, a: PType): TTypeRelation = else: discard proc typeRangeRel(f, a: PType): TTypeRelation {.noinline.} = - template check_range_in(t: typedesc): untyped = - let - a0 = firstValue[t](a) - a1 = lastValue[t](a) - f0 = firstValue[t](f) - f1 = lastValue[t](f) - if a0 == f0 and a1 == f1: - result = isEqual - elif a0 >= f0 and a1 <= f1: - result = isConvertible - elif a0 <= f1 and f0 <= a1: + template check_range[T](a_first, a_last, f_first, f_last: T): TTypeRelation = + if a_first == f_first and a_last == f_last: + isEqual + elif a_first >= f_first and a_last <= f_last: + isConvertible + elif a_first <= f_last and f_first <= a_last: # X..Y and C..D overlap iff (X <= D and C <= Y) - result = isConvertible + isConvertible else: - result = isNone + isNone if f.isOrdinalType: - check_range_in(BiggestInt) - else: - check_range_in(BiggestFloat) + check_range(firstOrd(a), lastOrd(a), firstOrd(f), lastOrd(f)) + else: + check_range(firstFloat(a), lastFloat(a), firstFloat(f), lastFloat(f)) proc matchUserTypeClass*(m: var TCandidate; ff, a: PType): PType = diff --git a/compiler/types.nim b/compiler/types.nim index 1fab842cc..83e20c38e 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -88,13 +88,16 @@ proc isPureObject*(typ: PType): bool = proc getOrdValue*(n: PNode): BiggestInt = case n.kind - of nkCharLit..nkUInt64Lit: result = n.intVal - of nkNilLit: result = 0 - of nkHiddenStdConv: result = getOrdValue(n.sons[1]) - else: - #localError(n.info, errOrdinalTypeExpected) - # XXX check usages of getOrdValue - result = high(BiggestInt) + of nkCharLit..nkUInt64Lit: n.intVal + of nkNilLit: 0 + of nkHiddenStdConv: getOrdValue(n.sons[1]) + else: high(BiggestInt) + +proc getFloatValue*(n: PNode): BiggestFloat = + case n.kind + of nkFloatLiterals: n.floatVal + of nkHiddenStdConv: getFloatValue(n.sons[1]) + else: NaN proc isIntLit*(t: PType): bool {.inline.} = result = t.kind == tyInt and t.n != nil and t.n.kind == nkIntLit @@ -623,6 +626,21 @@ proc firstOrd*(t: PType): BiggestInt = internalError(newPartialConfigRef(), "invalid kind for firstOrd(" & $t.kind & ')') result = 0 + +proc firstFloat*(t: PType): BiggestFloat = + case t.kind + of tyFloat..tyFloat128: -Inf + of tyRange: + assert(t.n != nil) # range directly given: + assert(t.n.kind == nkRange) + getFloatValue(t.n.sons[0]) + of tyVar: firstFloat(t.sons[0]) + of tyGenericInst, tyDistinct, tyTypeDesc, tyAlias, tyStatic, tyInferred: + firstFloat(lastSon(t)) + else: + internalError(newPartialConfigRef(), "invalid kind for firstValue(" & $t.kind & ')') + NaN + proc lastOrd*(t: PType; fixedUnsigned = false): BiggestInt = case t.kind of tyBool: result = 1 @@ -663,6 +681,22 @@ proc lastOrd*(t: PType; fixedUnsigned = false): BiggestInt = internalError(newPartialConfigRef(), "invalid kind for lastOrd(" & $t.kind & ')') result = 0 + +proc lastFloat*(t: PType): BiggestFloat = + case t.kind + of tyFloat..tyFloat128: Inf + of tyVar: lastFloat(t.sons[0]) + of tyRange: + assert(t.n != nil) # range directly given: + assert(t.n.kind == nkRange) + getFloatValue(t.n.sons[1]) + of tyGenericInst, tyDistinct, tyTypeDesc, tyAlias, tyStatic, tyInferred: + lastFloat(lastSon(t)) + else: + internalError(newPartialConfigRef(), "invalid kind for lastOrd(" & $t.kind & ')') + NaN + + proc lengthOrd*(t: PType): BiggestInt = case t.kind of tyInt64, tyInt32, tyInt: result = lastOrd(t) |