From f86f2928a7e4624711d72842b5c7f5e2cbe173ad Mon Sep 17 00:00:00 2001 From: metagn Date: Fri, 16 Aug 2024 09:22:49 +0300 Subject: [PATCH] fix `is` with `type`/`typedesc` crashing the compiler (#23967) fixes #22850 The `is` operator checks the type of the left hand side, and if it's generic or if it's a `typedesc` type with no base type, it leaves it to be evaluated later. But `typedesc` types with no base type precisely describe the default typeclass `type`/`typeclass`, so this condition is removed. Maybe at some point this represented an unresolved generic type? (cherry picked from commit 995081b56a098c431eb24fbb37afadb4cee2fb4b) --- compiler/semexprs.nim | 3 +-- tests/types/tisopr.nim | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index b654713af593..10057275accb 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -612,8 +612,7 @@ proc semIs(c: PContext, n: PNode, flags: TExprFlags): PNode = n[1] = makeTypeSymNode(c, lhsType, n[1].info) lhsType = n[1].typ else: - if lhsType.base.kind == tyNone or - (c.inGenericContext > 0 and lhsType.base.containsGenericType): + if c.inGenericContext > 0 and lhsType.base.containsGenericType: # BUGFIX: don't evaluate this too early: ``T is void`` return diff --git a/tests/types/tisopr.nim b/tests/types/tisopr.nim index 64b3d03c007e..c95b63c90f92 100644 --- a/tests/types/tisopr.nim +++ b/tests/types/tisopr.nim @@ -165,3 +165,7 @@ block: # previously tisop.nim doAssert f.y.typeof is float doAssert f.z.typeof is float p(A, f) + +block: # issue #22850 + doAssert not (type is int) + doAssert not (typedesc is int)