summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semexprs.nim5
-rw-r--r--tests/proc/tstaticsignature.nim15
2 files changed, 17 insertions, 3 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 081eb6847..1307b0ab7 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -2706,7 +2706,6 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
           elif not cannotResolve and val.intVal != 0 and result == nil:
             setResult(it[1])
             return # we're not in nimvm and we already have a result
-        it[1] = semGenericStmt(c, it[1])
       else:
         let e = forceBool(c, semConstExpr(c, it[0]))
         if e.kind != nkIntLit:
@@ -2719,7 +2718,7 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
     of nkElse, nkElseExpr:
       checkSonsLen(it, 1, c.config)
       if cannotResolve:
-        it[0] = semGenericStmt(c, it[0])
+        discard
       elif result == nil or whenNimvm:
         if semCheck:
           it[0] = semExpr(c, it[0], flags)
@@ -2730,7 +2729,7 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
           result = it[0]
     else: illFormedAst(n, c.config)
   if cannotResolve:
-    result = n
+    result = semGenericStmt(c, n)
     result.typ = makeTypeFromExpr(c, result.copyTree)
     return
   if result == nil:
diff --git a/tests/proc/tstaticsignature.nim b/tests/proc/tstaticsignature.nim
index 3c6d66b2b..518c88ba5 100644
--- a/tests/proc/tstaticsignature.nim
+++ b/tests/proc/tstaticsignature.nim
@@ -235,3 +235,18 @@ block: # issue #22607, needs nkWhenStmt to be handled like nkRecWhen
   test[true](1.int)
   test[false](1.0)
   doAssert not compiles(test[])
+
+block: # `when` in static signature
+  template ctAnd(a, b): bool =
+    when a:
+      when b: true
+      else: false
+    else: false
+  template test(): untyped =
+    when ctAnd(declared(SharedTable), typeof(result) is SharedTable):
+      result = SharedTable()
+    else:
+      result = 123
+  proc foo[T](): T = test()
+  proc bar[T](x = foo[T]()): T = x
+  doAssert bar[int]() == 123