mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-18 13:30:33 +00:00
fix assignment to converted concept type (#15051)
* fix assignment to converted concept type * check for resolved concepts * add extra test
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user