Skip to content

Commit

Permalink
fix assignment to converted concept type (nim-lang#15051)
Browse files Browse the repository at this point in the history
* fix assignment to converted concept type

* check for resolved concepts

* add extra test
  • Loading branch information
jcosborn authored Jul 24, 2020
1 parent 4b93c61 commit add003a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 17 deletions.
4 changes: 4 additions & 0 deletions compiler/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,11 @@ proc sameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =

if x == y: return true
var a = skipTypes(x, {tyGenericInst, tyAlias})
while a.kind == tyUserTypeClass and tfResolved in a.flags:
a = skipTypes(a[^1], {tyGenericInst, tyAlias})
var b = skipTypes(y, {tyGenericInst, tyAlias})
while b.kind == tyUserTypeClass and tfResolved in b.flags:
b = skipTypes(b[^1], {tyGenericInst, tyAlias})
assert(a != nil)
assert(b != nil)
if a.kind != b.kind:
Expand Down
54 changes: 37 additions & 17 deletions tests/concepts/tusertypeclasses2.nim
Original file line number Diff line number Diff line change
@@ -1,24 +1,44 @@
type
hasFieldX = concept z
z.x is int
block:
type
hasFieldX = concept z
z.x is int

obj_x = object
x: int
obj_x = object
x: int

ref_obj_x = ref object
x: int
ref_obj_x = ref object
x: int

ref_to_obj_x = ref obj_x
ref_to_obj_x = ref obj_x

p_o_x = ptr obj_x
v_o_x = var obj_x
p_o_x = ptr obj_x
v_o_x = var obj_x

template check(x) =
static: assert(x)
template check(x) =
static: assert(x)

check obj_x is hasFieldX
check ref_obj_x is hasFieldX
check ref_to_obj_x is hasFieldX
check p_o_x is hasFieldX
check v_o_x is hasFieldX
check obj_x is hasFieldX
check ref_obj_x is hasFieldX
check ref_to_obj_x is hasFieldX
check p_o_x is hasFieldX
check v_o_x is hasFieldX

block:
type
Foo = concept x
x.isFoo
Bar = distinct float
template isFoo(x: Bar): untyped = true
proc foo(x: var Foo) =
float(x) = 1.0
proc foo2(x: var Bar) =
float(x) = 1.0
proc foo3(x: var (Bar|SomeNumber)) =
float(x) = 1.0
proc foo4(x: var any) =
float(x) = 1.0
var x: Bar
foo(x)
foo2(x)
foo3(x)
foo4(x)

0 comments on commit add003a

Please sign in to comment.