disjoint checker is somewhat smarter

This commit is contained in:
Araq
2015-03-15 00:54:09 +01:00
parent 1838ea2db4
commit ea5217c9fc
3 changed files with 113 additions and 2 deletions

View File

@@ -373,13 +373,28 @@ proc addFactNeg*(m: var TModel, n: PNode) =
let n = n.neg
if n != nil: addFact(m, n)
proc canonOpr(opr: PSym): PSym =
case opr.magic
of someEq: result = opEq
of someLe: result = opLe
of someLt: result = opLt
of someLen: result = opLen
of someAdd: result = opAdd
of someSub: result = opSub
of someMul: result = opMul
of someDiv: result = opDiv
else: result = opr
proc sameTree*(a, b: PNode): bool =
result = false
if a == b:
result = true
elif (a != nil) and (b != nil) and (a.kind == b.kind):
elif a != nil and b != nil and a.kind == b.kind:
case a.kind
of nkSym: result = a.sym == b.sym
of nkSym:
result = a.sym == b.sym
if not result and a.sym.magic != mNone:
result = a.sym.magic == b.sym.magic or canonOpr(a.sym) == canonOpr(b.sym)
of nkIdent: result = a.ident.id == b.ident.id
of nkCharLit..nkInt64Lit: result = a.intVal == b.intVal
of nkFloatLit..nkFloat64Lit: result = a.floatVal == b.floatVal

81
tests/overload/tspec.nim Normal file
View File

@@ -0,0 +1,81 @@
discard """
output: '''not a var
not a var
a var
B
int
T
int16
T
ref T
123
2
1
@[123, 2, 1]'''
"""
# Things that's even in the spec now!
proc byvar(x: var int) = echo "a var"
proc byvar(x: int) = echo "not a var"
byvar(89)
let letSym = 0
var varSym = 13
byvar(letSym)
byvar(varSym)
type
A = object of RootObj
B = object of A
C = object of B
proc p(obj: A) =
echo "A"
proc p(obj: B) =
echo "B"
var c = C()
# not ambiguous, calls 'B', not 'A' since B is a subtype of A
# but not vice versa:
p(c)
proc pp(obj: A, obj2: B) = echo "A B"
proc pp(obj: B, obj2: A) = echo "B A"
# but this is ambiguous:
#pp(c, c)
proc takesInt(x: int) = echo "int"
proc takesInt[T](x: T) = echo "T"
proc takesInt(x: int16) = echo "int16"
takesInt(4) # "int"
var x: int32
takesInt(x) # "T"
var y: int16
takesInt(y) # "int16"
var z: range[0..4] = 0
takesInt(z) # "T"
proc gen[T](x: ref ref T) = echo "ref ref T"
proc gen[T](x: ref T) = echo "ref T"
proc gen[T](x: T) = echo "T"
var ri: ref int
gen(ri) # "ref T"
template rem(x: expr) = discard
#proc rem[T](x: T) = discard
rem unresolvedExpression(undeclaredIdentifier)
proc takeV[T](a: varargs[T]) =
for x in a: echo x
takeV([123, 2, 1]) # takeV's T is "int", not "array of int"
echo(@[123, 2, 1])

View File

@@ -0,0 +1,15 @@
import threadpool, os
proc single(time: int) =
sleep time
echo time
proc sleepsort(nums: openArray[int]) =
parallel:
var i = 0
while i <= len(nums) + -1:
spawn single(nums[i])
i += 1
sleepsort([50,3,40,25])