mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
fix nil literal giving itself type untyped/typed [backport] (#24165)
fixes #24164, regression from #20091 The expression `nil` as the default value of template parameter `x: untyped` is typechecked with expected type `untyped` since #20091. The expected type is checked if it matches the `nil` literal with a match better than a subtype match, and the type is set to it if it does. However `untyped` matches with a generic match which is better, so the `nil` literal has type `untyped`. This breaks type matching for the literal. So if the expected type is `untyped` or `typed`, it is now ignored and the `nil` literal just has the `nil` type.
This commit is contained in:
@@ -3314,7 +3314,7 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}, expectedType: PType
|
||||
of nkNilLit:
|
||||
if result.typ == nil:
|
||||
result.typ = getNilType(c)
|
||||
if expectedType != nil:
|
||||
if expectedType != nil and expectedType.kind notin {tyUntyped, tyTyped}:
|
||||
var m = newCandidate(c, result.typ)
|
||||
if typeRel(m, expectedType, result.typ) >= isSubtype:
|
||||
result.typ = expectedType
|
||||
|
||||
@@ -325,3 +325,9 @@ block: # bug #22180
|
||||
else:
|
||||
(ref A)(nil)
|
||||
doAssert y.isNil
|
||||
|
||||
block: # issue #24164, related regression
|
||||
proc foo(x: proc ()) = discard
|
||||
template bar(x: untyped = nil) =
|
||||
foo(x)
|
||||
bar()
|
||||
|
||||
Reference in New Issue
Block a user