mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
133 lines
3.0 KiB
Nim
133 lines
3.0 KiB
Nim
discard """
|
|
output: "OK"
|
|
"""
|
|
|
|
# bug #7818
|
|
# this is not a macro bug, but array construction bug
|
|
# I use macro to avoid object slicing
|
|
# see #7712 and #7637
|
|
import macros
|
|
|
|
type
|
|
Vehicle[T] = object of RootObj
|
|
tire: T
|
|
Car[T] = object of Vehicle[T]
|
|
Bike[T] = object of Vehicle[T]
|
|
|
|
macro peek(n: typed): untyped =
|
|
let val = getTypeImpl(n).treeRepr
|
|
newLit(val)
|
|
|
|
block test_t7818:
|
|
var v = Vehicle[int](tire: 3)
|
|
var c = Car[int](tire: 4)
|
|
var b = Bike[int](tire: 2)
|
|
|
|
let y = peek([c, b, v])
|
|
let z = peek([v, c, b])
|
|
doAssert(y == z)
|
|
|
|
block test_t7906_1:
|
|
proc init(x: typedesc, y: int): ref x =
|
|
result = new(ref x)
|
|
result.tire = y
|
|
|
|
var v = init(Vehicle[int], 3)
|
|
var c = init(Car[int], 4)
|
|
var b = init(Bike[int], 2)
|
|
|
|
let y = peek([c, b, v])
|
|
let z = peek([v, c, b])
|
|
doAssert(y == z)
|
|
|
|
block test_t7906_2:
|
|
var v = Vehicle[int](tire: 3)
|
|
var c = Car[int](tire: 4)
|
|
var b = Bike[int](tire: 2)
|
|
|
|
let y = peek([c.addr, b.addr, v.addr])
|
|
let z = peek([v.addr, c.addr, b.addr])
|
|
doAssert(y == z)
|
|
|
|
block test_t7906_3:
|
|
type
|
|
Animal[T] = object of RootObj
|
|
hair: T
|
|
Mammal[T] = object of Animal[T]
|
|
Monkey[T] = object of Mammal[T]
|
|
|
|
var v = Animal[int](hair: 3)
|
|
var c = Mammal[int](hair: 4)
|
|
var b = Monkey[int](hair: 2)
|
|
|
|
let z = peek([c.addr, b.addr, v.addr])
|
|
let y = peek([v.addr, c.addr, b.addr])
|
|
doAssert(y == z)
|
|
|
|
type
|
|
Fruit[T] = ref object of RootObj
|
|
color: T
|
|
Apple[T] = ref object of Fruit[T]
|
|
Banana[T] = ref object of Fruit[T]
|
|
|
|
proc testArray[T](x: array[3, Fruit[T]]): string =
|
|
result = ""
|
|
for c in x:
|
|
result.add $c.color
|
|
|
|
proc testOpenArray[T](x: openArray[Fruit[T]]): string =
|
|
result = ""
|
|
for c in x:
|
|
result.add $c.color
|
|
|
|
block test_t7906_4:
|
|
var v = Fruit[int](color: 3)
|
|
var c = Apple[int](color: 4)
|
|
var b = Banana[int](color: 2)
|
|
|
|
let y = peek([c, b, v])
|
|
let z = peek([v, c, b])
|
|
doAssert(y == z)
|
|
|
|
block test_t7906_5:
|
|
var a = Fruit[int](color: 1)
|
|
var b = Apple[int](color: 2)
|
|
var c = Banana[int](color: 3)
|
|
|
|
doAssert(testArray([a, b, c]) == "123")
|
|
doAssert(testArray([b, c, a]) == "231")
|
|
|
|
doAssert(testOpenArray([a, b, c]) == "123")
|
|
doAssert(testOpenArray([b, c, a]) == "231")
|
|
|
|
doAssert(testOpenArray(@[a, b, c]) == "123")
|
|
doAssert(testOpenArray(@[b, c, a]) == "231")
|
|
|
|
proc testArray[T](x: array[3, ptr Vehicle[T]]): string =
|
|
result = ""
|
|
for c in x:
|
|
result.add $c.tire
|
|
|
|
proc testOpenArray[T](x: openArray[ptr Vehicle[T]]): string =
|
|
result = ""
|
|
for c in x:
|
|
result.add $c.tire
|
|
|
|
block test_t7906_6:
|
|
var u = Vehicle[int](tire: 1)
|
|
var v = Bike[int](tire: 2)
|
|
var w = Car[int](tire: 3)
|
|
|
|
doAssert(testArray([u.addr, v.addr, w.addr]) == "123")
|
|
doAssert(testArray([w.addr, u.addr, v.addr]) == "312")
|
|
|
|
doAssert(testOpenArray([u.addr, v.addr, w.addr]) == "123")
|
|
doAssert(testOpenArray([w.addr, u.addr, v.addr]) == "312")
|
|
|
|
doAssert(testOpenArray(@[u.addr, v.addr, w.addr]) == "123")
|
|
doAssert(testOpenArray(@[w.addr, u.addr, v.addr]) == "312")
|
|
|
|
echo "OK"
|
|
|
|
|