diff options
-rw-r--r-- | compiler/astalgo.nim | 12 | ||||
-rw-r--r-- | compiler/types.nim | 32 | ||||
-rw-r--r-- | tests/misc/tvarious1.nim | 9 |
3 files changed, 40 insertions, 13 deletions
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim index 16efbb172..eb7ffc63e 100644 --- a/compiler/astalgo.nim +++ b/compiler/astalgo.nim @@ -116,14 +116,6 @@ proc iiTablePut*(t: var TIITable, key, val: int) # implementation -proc skipConv*(n: PNode): PNode = - case n.kind - of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64: - result = n.sons[0] - of nkHiddenStdConv, nkHiddenSubConv, nkConv: - result = n.sons[1] - else: result = n - proc skipConvAndClosure*(n: PNode): PNode = result = n while true: @@ -135,10 +127,6 @@ proc skipConvAndClosure*(n: PNode): PNode = result = result.sons[1] else: break -proc skipConvTakeType*(n: PNode): PNode = - result = n.skipConv - result.typ = n.typ - proc sameValue*(a, b: PNode): bool = result = false case a.kind diff --git a/compiler/types.nim b/compiler/types.nim index b25e3f697..824ca47d0 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -1369,3 +1369,35 @@ proc containsCompileTimeOnly*(t: PType): bool = if t.sons[i] != nil and isCompileTimeOnly(t.sons[i]): return true return false + +type + OrdinalType* = enum + NoneLike, IntLike, FloatLike + +proc classify*(t: PType): OrdinalType = + ## for convenient type checking: + if t == nil: + result = NoneLike + else: + case skipTypes(t, abstractVarRange).kind + of tyFloat..tyFloat128: result = FloatLike + of tyInt..tyInt64, tyUInt..tyUInt64, tyBool, tyChar, tyEnum: + result = IntLike + else: result = NoneLike + +proc skipConv*(n: PNode): PNode = + result = n + case n.kind + of nkObjUpConv, nkObjDownConv, nkChckRange, nkChckRangeF, nkChckRange64: + # only skip the conversion if it doesn't lose too important information + # (see bug # + if n.sons[0].typ.classify == n.typ.classify: + result = n.sons[0] + of nkHiddenStdConv, nkHiddenSubConv, nkConv: + if n.sons[1].typ.classify == n.typ.classify: + result = n.sons[1] + else: discard + +proc skipConvTakeType*(n: PNode): PNode = + result = n.skipConv + result.typ = n.typ diff --git a/tests/misc/tvarious1.nim b/tests/misc/tvarious1.nim index 6e4612ae3..1f2da2ae5 100644 --- a/tests/misc/tvarious1.nim +++ b/tests/misc/tvarious1.nim @@ -3,7 +3,8 @@ discard """ output: '''1 0 Whopie -12''' +12 +1.7''' """ echo len([1_000_000]) #OUT 1 @@ -39,3 +40,9 @@ var val12 = TSomeRange(hour: 12) value = $(if val12.hour > 12: val12.hour - 12 else: val12.hour) echo value + +# bug #1334 + +var ys = @[4.1, 5.6, 7.2, 1.7, 9.3, 4.4, 3.2] +#var x = int(ys.high / 2) #echo ys[x] # Works +echo ys[int(ys.high / 2)] # Doesn't work |