diff options
-rw-r--r-- | compiler/semexprs.nim | 5 | ||||
-rw-r--r-- | tests/proc/tstaticsignature.nim | 15 |
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 |