From c3a9ac4d352a84fb47da0a4d5fc6f963b651bbec Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Mon, 30 Jul 2018 10:51:14 +0200 Subject: [PATCH] Try conversion to static[T] in generic instantation (#8443) Fixes #8439 --- compiler/semcall.nim | 10 +++++++++- tests/generics/t8439.nim | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/generics/t8439.nim diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 67fe992321..aa5394a719 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -505,7 +505,15 @@ proc explicitGenericSym(c: PContext, n: PNode, s: PSym): PNode = for i in 1..sonsLen(n)-1: let formal = s.ast.sons[genericParamsPos].sons[i-1].typ - let arg = n[i].typ + var arg = n[i].typ + # try transforming the argument into a static one before feeding it into + # typeRel + if formal.kind == tyStatic and arg.kind != tyStatic: + let evaluated = c.semTryConstExpr(c, n[i]) + if evaluated != nil: + arg = newTypeS(tyStatic, c) + arg.sons = @[evaluated.typ] + arg.n = evaluated let tm = typeRel(m, formal, arg) if tm in {isNone, isConvertible}: return nil var newInst = generateInstance(c, s, m.bindings, n.info) diff --git a/tests/generics/t8439.nim b/tests/generics/t8439.nim new file mode 100644 index 0000000000..69bd7cfcb8 --- /dev/null +++ b/tests/generics/t8439.nim @@ -0,0 +1,10 @@ +discard """ + output: "1" +""" + +type + Cardinal = enum + north, east, south, west + +proc foo[cardinal: static[Cardinal]](): int = 1 +echo(foo[north]())