From 77e58bf573040cc081a58046a97f1ddfb61f27fe Mon Sep 17 00:00:00 2001 From: metagn Date: Sat, 12 Nov 2022 07:27:51 +0300 Subject: [PATCH] fixes #20807, refs #20450, regression with seq inference (#20818) --- compiler/semexprs.nim | 6 +++++- tests/types/ttopdowninference.nim | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 39649fa271222..cecbe5f9b5a0d 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2402,12 +2402,16 @@ proc semMagic(c: PContext, n: PNode, s: PSym, flags: TExprFlags; expectedType: P markUsed(c, n.info, s) result = semSizeof(c, setMs(n, s)) of mArrToSeq, mOpenArrayToSeq: - if n.len == 2 and expectedType != nil and ( + if expectedType != nil and ( let expected = expectedType.skipTypes(abstractRange-{tyDistinct}); expected.kind in {tySequence, tyOpenArray}): # seq type inference var arrayType = newType(tyOpenArray, nextTypeId(c.idgen), expected.owner) arrayType.rawAddSon(expected[0]) + if n[0].kind == nkSym and sfFromGeneric in n[0].sym.flags: + # may have been resolved to `@`[empty] at some point, + # reset to `@` to deal with this + n[0] = newSymNode(n[0].sym.owner, n[0].info) n[1] = semExpr(c, n[1], flags, arrayType) result = semDirectOp(c, n, flags, expectedType) else: diff --git a/tests/types/ttopdowninference.nim b/tests/types/ttopdowninference.nim index e4a340034adc0..310dbb2adf9ea 100644 --- a/tests/types/ttopdowninference.nim +++ b/tests/types/ttopdowninference.nim @@ -244,3 +244,14 @@ block: # bug #11777 type S = set[0..5] var s: S = {1, 2} doAssert 1 in s + +block: # regression #20807 + var s: seq[string] + template fail = + s = @[] + template test(body: untyped) = + body + proc test(a: string) = discard + test: fail() + doAssert not (compiles do: + let x: seq[int] = `@`[string]([]))