diff --git a/compiler/types.nim b/compiler/types.nim index 506e63478..b0581e96a 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -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: diff --git a/tests/concepts/tusertypeclasses2.nim b/tests/concepts/tusertypeclasses2.nim index ae05540cd..c9978f6ef 100644 --- a/tests/concepts/tusertypeclasses2.nim +++ b/tests/concepts/tusertypeclasses2.nim @@ -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)