fixes the integer conversion regressions
This commit is contained in:
parent
c94f5bfb06
commit
20774ad43c
7 changed files with 29 additions and 26 deletions
|
|
@ -672,7 +672,7 @@ proc toFileLine*(info: TLineInfo): string {.inline.} =
|
||||||
proc toFileLineCol*(info: TLineInfo): string {.inline.} =
|
proc toFileLineCol*(info: TLineInfo): string {.inline.} =
|
||||||
result = info.toFilename & "(" & $info.line & "," & $info.col & ")"
|
result = info.toFilename & "(" & $info.line & "," & $info.col & ")"
|
||||||
|
|
||||||
template `$`*(info: TLineInfo): expr = toFileLineCol(info)
|
proc `$`*(info: TLineInfo): string = toFileLineCol(info)
|
||||||
|
|
||||||
proc `??`* (info: TLineInfo, filename: string): bool =
|
proc `??`* (info: TLineInfo, filename: string): bool =
|
||||||
# only for debugging purposes
|
# only for debugging purposes
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,9 @@ proc pickBestCandidate(c: PContext, headSymbol: PNode,
|
||||||
if cmp < 0: best = z # x is better than the best so far
|
if cmp < 0: best = z # x is better than the best so far
|
||||||
elif cmp == 0: alt = z # x is as good as the best so far
|
elif cmp == 0: alt = z # x is as good as the best so far
|
||||||
else: discard
|
else: discard
|
||||||
|
#if sym.name.s == "shl" and (n.info ?? "net.nim"):
|
||||||
|
# echo "Matches ", n.info, " ", typeToString(sym.typ)
|
||||||
|
# writeMatches(z)
|
||||||
sym = nextOverloadIter(o, c, headSymbol)
|
sym = nextOverloadIter(o, c, headSymbol)
|
||||||
|
|
||||||
proc notFoundError*(c: PContext, n: PNode, errors: CandidateErrors) =
|
proc notFoundError*(c: PContext, n: PNode, errors: CandidateErrors) =
|
||||||
|
|
|
||||||
|
|
@ -205,10 +205,11 @@ proc cmpCandidates*(a, b: TCandidate): int =
|
||||||
|
|
||||||
proc writeMatches*(c: TCandidate) =
|
proc writeMatches*(c: TCandidate) =
|
||||||
writeln(stdout, "exact matches: " & $c.exactMatches)
|
writeln(stdout, "exact matches: " & $c.exactMatches)
|
||||||
writeln(stdout, "subtype matches: " & $c.subtypeMatches)
|
|
||||||
writeln(stdout, "conv matches: " & $c.convMatches)
|
|
||||||
writeln(stdout, "intconv matches: " & $c.intConvMatches)
|
|
||||||
writeln(stdout, "generic matches: " & $c.genericMatches)
|
writeln(stdout, "generic matches: " & $c.genericMatches)
|
||||||
|
writeln(stdout, "subtype matches: " & $c.subtypeMatches)
|
||||||
|
writeln(stdout, "intconv matches: " & $c.intConvMatches)
|
||||||
|
writeln(stdout, "conv matches: " & $c.convMatches)
|
||||||
|
writeln(stdout, "inheritance: " & $c.inheritancePenalty)
|
||||||
|
|
||||||
proc argTypeToString(arg: PNode; prefer: TPreferedDesc): string =
|
proc argTypeToString(arg: PNode; prefer: TPreferedDesc): string =
|
||||||
if arg.kind in nkSymChoices:
|
if arg.kind in nkSymChoices:
|
||||||
|
|
@ -267,7 +268,7 @@ proc concreteType(c: TCandidate, t: PType): PType =
|
||||||
else:
|
else:
|
||||||
result = t # Note: empty is valid here
|
result = t # Note: empty is valid here
|
||||||
|
|
||||||
proc handleRange(f, a: PType, validconv: set[TTypeKind]): TTypeRelation =
|
proc handleRange(f, a: PType, min, max: TTypeKind): TTypeRelation =
|
||||||
if a.kind == f.kind:
|
if a.kind == f.kind:
|
||||||
result = isEqual
|
result = isEqual
|
||||||
else:
|
else:
|
||||||
|
|
@ -281,9 +282,9 @@ proc handleRange(f, a: PType, validconv: set[TTypeKind]): TTypeRelation =
|
||||||
# integer literal in the proper range; we want ``i16 + 4`` to stay an
|
# integer literal in the proper range; we want ``i16 + 4`` to stay an
|
||||||
# ``int16`` operation so we declare the ``4`` pseudo-equal to int16
|
# ``int16`` operation so we declare the ``4`` pseudo-equal to int16
|
||||||
result = isFromIntLit
|
result = isFromIntLit
|
||||||
elif f.kind == tyInt and k in {tyInt8..tyInt32, tyUint8..tyUInt16}:
|
elif f.kind == tyInt and k in {tyInt8..tyInt32}:
|
||||||
result = isIntConv
|
result = isIntConv
|
||||||
elif k in validconv:
|
elif k >= min and k <= max:
|
||||||
result = isConvertible
|
result = isConvertible
|
||||||
elif a.kind == tyRange and a.sons[0].kind in {tyInt..tyInt64,
|
elif a.kind == tyRange and a.sons[0].kind in {tyInt..tyInt64,
|
||||||
tyUInt8..tyUInt32} and
|
tyUInt8..tyUInt32} and
|
||||||
|
|
@ -663,16 +664,16 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
|
||||||
result = isIntConv
|
result = isIntConv
|
||||||
elif isConvertibleToRange(skipTypes(f, {tyRange}), a):
|
elif isConvertibleToRange(skipTypes(f, {tyRange}), a):
|
||||||
result = isConvertible # a convertible to f
|
result = isConvertible # a convertible to f
|
||||||
of tyInt: result = handleRange(f, a, {tyInt8..tyInt32,tyUInt8..tyUInt16})
|
of tyInt: result = handleRange(f, a, tyInt8, tyInt32)
|
||||||
of tyInt8: result = handleRange(f, a, {tyInt8})
|
of tyInt8: result = handleRange(f, a, tyInt8, tyInt8)
|
||||||
of tyInt16: result = handleRange(f, a, {tyInt8..tyInt16,tyUInt8})
|
of tyInt16: result = handleRange(f, a, tyInt8, tyInt16)
|
||||||
of tyInt32: result = handleRange(f, a, {tyInt8..tyInt32,tyUInt8..tyUInt16})
|
of tyInt32: result = handleRange(f, a, tyInt8, tyInt32)
|
||||||
of tyInt64: result = handleRange(f, a, {tyInt..tyInt64,tyUInt8..tyUInt32})
|
of tyInt64: result = handleRange(f, a, tyInt, tyInt64)
|
||||||
of tyUInt: result = handleRange(f, a, {tyUInt8..tyUInt32})
|
of tyUInt: result = handleRange(f, a, tyUInt8, tyUInt32)
|
||||||
of tyUInt8: result = handleRange(f, a, {tyUInt8})
|
of tyUInt8: result = handleRange(f, a, tyUInt8, tyUInt8)
|
||||||
of tyUInt16: result = handleRange(f, a, {tyUInt8..tyUInt16})
|
of tyUInt16: result = handleRange(f, a, tyUInt8, tyUInt16)
|
||||||
of tyUInt32: result = handleRange(f, a, {tyUInt8..tyUInt32})
|
of tyUInt32: result = handleRange(f, a, tyUInt8, tyUInt32)
|
||||||
of tyUInt64: result = handleRange(f, a, {tyUInt..tyUInt64})
|
of tyUInt64: result = handleRange(f, a, tyUInt, tyUInt64)
|
||||||
of tyFloat: result = handleFloatRange(f, a)
|
of tyFloat: result = handleFloatRange(f, a)
|
||||||
of tyFloat32: result = handleFloatRange(f, a)
|
of tyFloat32: result = handleFloatRange(f, a)
|
||||||
of tyFloat64: result = handleFloatRange(f, a)
|
of tyFloat64: result = handleFloatRange(f, a)
|
||||||
|
|
|
||||||
|
|
@ -1036,7 +1036,7 @@ proc `$`*(address: TIpAddress): string =
|
||||||
else: # Print address
|
else: # Print address
|
||||||
var printedLastGroup = false
|
var printedLastGroup = false
|
||||||
for i in 0..7:
|
for i in 0..7:
|
||||||
var word:uint16 = (cast[uint16](address.address_v6[i*2])) shl 8u16
|
var word:uint16 = (cast[uint16](address.address_v6[i*2])) shl 8
|
||||||
word = word or cast[uint16](address.address_v6[i*2+1])
|
word = word or cast[uint16](address.address_v6[i*2+1])
|
||||||
|
|
||||||
if biggestZeroCount != 0 and # Check if group is in skip group
|
if biggestZeroCount != 0 and # Check if group is in skip group
|
||||||
|
|
@ -1058,7 +1058,7 @@ proc `$`*(address: TIpAddress): string =
|
||||||
else: # val >= 0xA
|
else: # val >= 0xA
|
||||||
result.add(chr(uint16(ord('a'))+val-0xA))
|
result.add(chr(uint16(ord('a'))+val-0xA))
|
||||||
afterLeadingZeros = true
|
afterLeadingZeros = true
|
||||||
mask = mask shr 4u16
|
mask = mask shr 4
|
||||||
printedLastGroup = true
|
printedLastGroup = true
|
||||||
|
|
||||||
proc parseIPv4Address(address_str: string): TIpAddress =
|
proc parseIPv4Address(address_str: string): TIpAddress =
|
||||||
|
|
@ -1073,7 +1073,7 @@ proc parseIPv4Address(address_str: string): TIpAddress =
|
||||||
|
|
||||||
for i in 0 .. high(address_str):
|
for i in 0 .. high(address_str):
|
||||||
if address_str[i] in strutils.Digits: # Character is a number
|
if address_str[i] in strutils.Digits: # Character is a number
|
||||||
currentByte = currentByte * 10u16 +
|
currentByte = currentByte * 10 +
|
||||||
cast[uint16](ord(address_str[i]) - ord('0'))
|
cast[uint16](ord(address_str[i]) - ord('0'))
|
||||||
if currentByte > 255'u16:
|
if currentByte > 255'u16:
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,7 @@ when not defined(js):
|
||||||
proc newFileStream*(filename: string, mode: FileMode): FileStream =
|
proc newFileStream*(filename: string, mode: FileMode): FileStream =
|
||||||
## creates a new stream from the file named `filename` with the mode `mode`.
|
## creates a new stream from the file named `filename` with the mode `mode`.
|
||||||
## If the file cannot be opened, nil is returned. See the `system
|
## If the file cannot be opened, nil is returned. See the `system
|
||||||
## <system.html>`_ module for a list of available TFileMode enums.
|
## <system.html>`_ module for a list of available FileMode enums.
|
||||||
var f: File
|
var f: File
|
||||||
if open(f, filename, mode): result = newFileStream(f)
|
if open(f, filename, mode): result = newFileStream(f)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,3 @@
|
||||||
discard """
|
|
||||||
output: ''''''
|
|
||||||
"""
|
|
||||||
|
|
||||||
import unsigned
|
import unsigned
|
||||||
|
|
||||||
|
|
|
||||||
6
todo.txt
6
todo.txt
|
|
@ -1,6 +1,8 @@
|
||||||
version 0.10
|
version 0.10
|
||||||
============
|
============
|
||||||
|
|
||||||
|
- document the 'finished' gotcha
|
||||||
|
- improve the docs for inheritance
|
||||||
- The bitwise 'not' operator will be renamed to 'bnot' to
|
- The bitwise 'not' operator will be renamed to 'bnot' to
|
||||||
prevent 'not 4 == 5' from compiling. -> requires 'mixin' annotation for procs!
|
prevent 'not 4 == 5' from compiling. -> requires 'mixin' annotation for procs!
|
||||||
- parameter lists without type end up in 'experimental'
|
- parameter lists without type end up in 'experimental'
|
||||||
|
|
@ -11,7 +13,8 @@ version 0.10
|
||||||
- make nimble part of the distribution
|
- make nimble part of the distribution
|
||||||
- split idetools into separate tool
|
- split idetools into separate tool
|
||||||
- split docgen into separate tool
|
- split docgen into separate tool
|
||||||
|
- special rule for ``[]=``, items, pairs
|
||||||
|
- BUG: echo with template `$`*(info: TLineInfo): expr = toFileLineCol(info)
|
||||||
|
|
||||||
|
|
||||||
Concurrency
|
Concurrency
|
||||||
|
|
@ -32,7 +35,6 @@ Misc
|
||||||
|
|
||||||
- make '--implicitStatic:on' the default
|
- make '--implicitStatic:on' the default
|
||||||
- make tuple unpacking work in a non-var/let context
|
- make tuple unpacking work in a non-var/let context
|
||||||
- special rule for ``[]=``, items, pairs
|
|
||||||
- built-in 'getImpl'
|
- built-in 'getImpl'
|
||||||
- prevent 'alloc(TypeWithGCedMemory)'
|
- prevent 'alloc(TypeWithGCedMemory)'
|
||||||
- some table related tests are wrong (memory usage checks)
|
- some table related tests are wrong (memory usage checks)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue