Skip to content

Commit

Permalink
fixes #7818, correct internal representation of generic objects array…
Browse files Browse the repository at this point in the history
… construction (#7824)

* defer skiptypes
* defer skiptypes for tyRef & tyPtr
* remove unneeded skipTypes
  • Loading branch information
jangko authored and Araq committed May 29, 2018
1 parent a075a91 commit 25a41d5
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 3 deletions.
2 changes: 1 addition & 1 deletion compiler/sem.nim
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ proc commonType*(x, y: PType): PType =
a = a.lastSon.skipTypes({tyGenericInst})
b = b.lastSon.skipTypes({tyGenericInst})
if a.kind == tyObject and b.kind == tyObject:
result = commonSuperclass(a, b)
result = commonSuperclass(a, b, k)
# this will trigger an error later:
if result.isNil or result == a: return x
if result == b: return y
Expand Down
8 changes: 6 additions & 2 deletions compiler/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1043,7 +1043,7 @@ proc inheritanceDiff*(a, b: PType): int =
inc(result)
result = high(int)

proc commonSuperclass*(a, b: PType): PType =
proc commonSuperclass*(a, b: PType, k: TTypeKind): PType =
# quick check: are they the same?
if sameObjectTypes(a, b): return a

Expand All @@ -1059,8 +1059,12 @@ proc commonSuperclass*(a, b: PType): PType =
x = x.sons[0]
var y = b
while y != nil:
var t = y # bug #7818, save type before skip
y = skipTypes(y, skipPtrs)
if ancestors.contains(y.id): return y
if ancestors.contains(y.id):
# bug #7818, defer the previous skipTypes
if k in {tyRef, tyPtr}: t = y
return t
y = y.sons[0]

type
Expand Down
45 changes: 45 additions & 0 deletions tests/array/t7818.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
discard """
msg: '''BracketExpr
Sym "array"
Infix
Ident ".."
IntLit 0
IntLit 2
BracketExpr
Sym "Vehicle"
Sym "int"
---------
BracketExpr
Sym "array"
Infix
Ident ".."
IntLit 0
IntLit 2
BracketExpr
Sym "Vehicle"
Sym "int"
---------'''
"""

# 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 =
echo getTypeImpl(n).treeRepr
echo "---------"

var v = Vehicle[int](tire: 3)
var c = Car[int](tire: 4)
var b = Bike[int](tire: 2)

peek([c, b, v])
peek([v, c, b])

0 comments on commit 25a41d5

Please sign in to comment.