Merge tests into a larger file (part 8 of ∞) (#9583)

* merge tuple tests

* merge trmacros tests

* merge template tests
This commit is contained in:
Miran 2018-11-06 18:33:58 +01:00 • committed by Arne Döring
commit 66a76d3165
51 changed files with 862 additions and 835 deletions

View file

@ -1,9 +0,0 @@
discard """
output: "12false3ha"
"""
proc f(x: varargs[string, `$`]) = discard
template optF{f(x)}(x: varargs[untyped]) =
writeLine(stdout, x)
f 1, 2, false, 3, "ha"

View file

@ -1,13 +0,0 @@
discard """
output: "4"
"""
template cse{f(a, a, x)}(a: typed{(nkDotExpr|call|nkBracketExpr)&noSideEffect},
f: typed, x: varargs[typed]): untyped =
let aa = a
f(aa, aa, x)+4
var
a: array[0..10, int]
i = 3
echo a[i] + a[i]

View file

@ -1,13 +0,0 @@
discard """
output: '''true
true'''
"""
import pegs
template optPeg{peg(pattern)}(pattern: string{lit}): Peg =
var gl {.global, gensym.} = peg(pattern)
gl
echo match("(a b c)", peg"'(' @ ')'")
echo match("W_HI_Le", peg"\y 'while'")

View file

@ -1,29 +0,0 @@
discard """
output: "21"
"""
import macros
type
TMat = object
dummy: int
proc `*`(a, b: TMat): TMat = nil
proc `+`(a, b: TMat): TMat = nil
proc `-`(a, b: TMat): TMat = nil
proc `$`(a: TMat): string = result = $a.dummy
proc mat21(): TMat =
result.dummy = 21
macro optOps{ (`+`|`-`|`*`) ** a }(a: TMat): untyped =
echo treeRepr(a)
result = newCall(bindSym"mat21")
#macro optPlus{ `+` * a }(a: varargs[TMat]): expr =
# result = newIntLitNode(21)
var x, y, z: TMat
echo x + y * z - x
#echo x + y + z

View file

@ -1,16 +0,0 @@
discard """
output: "23"
"""
template optslice{a = b + c}(a: untyped{noalias}, b, c: untyped): typed =
a = b
inc a, c
var
x = 12
y = 10
z = 13
x = y+z
echo x

View file

@ -1,19 +0,0 @@
discard """
output: '''0'''
"""
# bug #206
template optimizeOut{testFunc(a, b)}(a: int, b: int{alias}): untyped = 0
proc testFunc(a, b: int): int = result = a + b
var testVar = 1
echo testFunc(testVar, testVar)
template ex{a = b + c}(a : int{noalias}, b, c : int) =
a = b
inc a, b
echo "came here"
var x = 5
x = x + x

View file

@ -1,10 +0,0 @@
discard """
output: "4"
"""
# test that an endless recursion is avoided:
template optLen{len(x)}(x: typed): int = len(x)
var s = "lala"
echo len(s)

View file

@ -1,11 +0,0 @@
discard """
output: '''-2'''
"""
proc p(x, y: int; cond: bool): int =
result = if cond: x + y else: x - y
template optP{p(x, y, true)}(x, y): untyped = x - y
template optP{p(x, y, false)}(x, y): untyped = x + y
echo p(2, 4, true)

View file

@ -1,23 +0,0 @@
discard """
output: '''48
hel
lo'''
"""
template optZero{x+x}(x: int): int = x*3
template andthen{`*`(x,3)}(x: int): int = x*4
template optSubstr1{x = substr(x, a, b)}(x: string, a, b: int) = setlen(x, b+1)
var y = 12
echo y+y
var s: array[0..2, string]
s[0] = "hello"
s[0] = substr(s[0], 0, 2)
echo s[0]
# Test varargs matching
proc someVarargProc(k: varargs[string]) = doAssert(false) # this should not get called
template someVarargProcSingleArg{someVarargProc([a])}(a: string) = echo a
someVarargProc("lo")

View file

@ -0,0 +1,110 @@
discard """
output: '''
12false3ha
21
optimized
'''
"""
import macros, pegs
block arglist:
proc f(x: varargs[string, `$`]) = discard
template optF{f(x)}(x: varargs[untyped]) =
writeLine(stdout, x)
f 1, 2, false, 3, "ha"
block tcse:
template cse{f(a, a, x)}(a: typed{(nkDotExpr|call|nkBracketExpr)&noSideEffect},
f: typed, x: varargs[typed]): untyped =
let aa = a
f(aa, aa, x)+4
var
a: array[0..10, int]
i = 3
doAssert a[i] + a[i] == 4
block hoist:
template optPeg{peg(pattern)}(pattern: string{lit}): Peg =
var gl {.global, gensym.} = peg(pattern)
gl
doAssert match("(a b c)", peg"'(' @ ')'")
doAssert match("W_HI_Le", peg"\y 'while'")
block tmatrix:
type
TMat = object
dummy: int
proc `*`(a, b: TMat): TMat = nil
proc `+`(a, b: TMat): TMat = nil
proc `-`(a, b: TMat): TMat = nil
proc `$`(a: TMat): string = result = $a.dummy
proc mat21(): TMat =
result.dummy = 21
macro optOps{ (`+`|`-`|`*`) ** a }(a: TMat): untyped =
result = newCall(bindSym"mat21")
#macro optPlus{ `+` * a }(a: varargs[TMat]): expr =
# result = newIntLitNode(21)
var x, y, z: TMat
echo x + y * z - x
block tnoalias:
template optslice{a = b + c}(a: untyped{noalias}, b, c: untyped): typed =
a = b
inc a, c
var
x = 12
y = 10
z = 13
x = y+z
doAssert x == 23
block tnoendlessrec:
# test that an endless recursion is avoided:
template optLen{len(x)}(x: typed): int = len(x)
var s = "lala"
doAssert len(s) == 4
block tstatic_t_bug:
# bug #4227
type Vector64[N: static[int]] = array[N, int]
proc `*`[N: static[int]](a: Vector64[N]; b: float64): Vector64[N] =
result = a
proc `+=`[N: static[int]](a: var Vector64[N]; b: Vector64[N]) =
echo "regular"
proc linearCombinationMut[N: static[int]](a: float64, v: var Vector64[N], w: Vector64[N]) {. inline .} =
echo "optimized"
template rewriteLinearCombinationMut{v += `*`(w, a)}(a: float64, v: var Vector64, w: Vector64): auto =
linearCombinationMut(a, v, w)
proc main() =
const scaleVal = 9.0
var a, b: Vector64[7]
a += b * scaleval
main()

View file

@ -0,0 +1,79 @@
discard """
output: '''
0
-2
48
hel
lo
my awesome concat
'''
"""
block tnoalias2:
# bug #206
template optimizeOut{testFunc(a, b)}(a: int, b: int{alias}): untyped = 0
proc testFunc(a, b: int): int = result = a + b
var testVar = 1
echo testFunc(testVar, testVar)
template ex{a = b + c}(a : int{noalias}, b, c : int) =
a = b
inc a, b
echo "came here"
var x = 5
x = x + x
block tpartial:
proc p(x, y: int; cond: bool): int =
result = if cond: x + y else: x - y
template optP{p(x, y, true)}(x, y): untyped = x - y
template optP{p(x, y, false)}(x, y): untyped = x + y
echo p(2, 4, true)
block tpatterns:
template optZero{x+x}(x: int): int = x*3
template andthen{`*`(x,3)}(x: int): int = x*4
template optSubstr1{x = substr(x, a, b)}(x: string, a, b: int) = setlen(x, b+1)
var y = 12
echo y+y
var s: array[0..2, string]
s[0] = "hello"
s[0] = substr(s[0], 0, 2)
echo s[0]
# Test varargs matching
proc someVarargProc(k: varargs[string]) = doAssert(false) # this should not get called
template someVarargProcSingleArg{someVarargProc([a])}(a: string) = echo a
someVarargProc("lo")
block tstar:
var
calls = 0
proc `&&`(s: varargs[string]): string =
result = s[0]
for i in 1..len(s)-1: result.add s[i]
inc calls
template optConc{ `&&` * a }(a: string): string = &&a
let space = " "
echo "my" && (space & "awe" && "some " ) && "concat"
# check that it's been optimized properly:
doAssert calls == 1

View file

@ -1,19 +0,0 @@
discard """
output: "my awesome concat"
"""
var
calls = 0
proc `&&`(s: varargs[string]): string =
result = s[0]
for i in 1..len(s)-1: result.add s[i]
inc calls
template optConc{ `&&` * a }(a: string): string = &&a
let space = " "
echo "my" && (space & "awe" && "some " ) && "concat"
# check that it's been optimized properly:
doAssert calls == 1

View file

@ -1,24 +0,0 @@
discard """
output: "optimized"
"""
# bug #4227
type Vector64[N: static[int]] = array[N, int]
proc `*`*[N: static[int]](a: Vector64[N]; b: float64): Vector64[N] =
result = a
proc `+=`*[N: static[int]](a: var Vector64[N]; b: Vector64[N]) =
echo "regular"
proc linearCombinationMut[N: static[int]](a: float64, v: var Vector64[N], w: Vector64[N]) {. inline .} =
echo "optimized"
template rewriteLinearCombinationMut*{v += `*`(w, a)}(a: float64, v: var Vector64, w: Vector64): auto =
linearCombinationMut(a, v, w)
proc main() =
const scaleVal = 9.0
var a, b: Vector64[7]
a += b * scaleval
main()