disjoint checker is somewhat smarter
This commit is contained in:
parent
1838ea2db4
commit
ea5217c9fc
3 changed files with 113 additions and 2 deletions
|
|
@ -373,13 +373,28 @@ proc addFactNeg*(m: var TModel, n: PNode) =
|
||||||
let n = n.neg
|
let n = n.neg
|
||||||
if n != nil: addFact(m, n)
|
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 =
|
proc sameTree*(a, b: PNode): bool =
|
||||||
result = false
|
result = false
|
||||||
if a == b:
|
if a == b:
|
||||||
result = true
|
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
|
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 nkIdent: result = a.ident.id == b.ident.id
|
||||||
of nkCharLit..nkInt64Lit: result = a.intVal == b.intVal
|
of nkCharLit..nkInt64Lit: result = a.intVal == b.intVal
|
||||||
of nkFloatLit..nkFloat64Lit: result = a.floatVal == b.floatVal
|
of nkFloatLit..nkFloat64Lit: result = a.floatVal == b.floatVal
|
||||||
|
|
|
||||||
81
tests/overload/tspec.nim
Normal file
81
tests/overload/tspec.nim
Normal 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])
|
||||||
15
tests/parallel/tdont_be_stupid.nim
Normal file
15
tests/parallel/tdont_be_stupid.nim
Normal 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])
|
||||||
Loading…
Add table
Add a link
Reference in a new issue