diff options
author | LemonBoy <LemonBoy@users.noreply.github.com> | 2018-07-30 10:51:14 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-07-30 10:51:14 +0200 |
commit | c3a9ac4d352a84fb47da0a4d5fc6f963b651bbec (patch) | |
tree | ffabccbe9fd3bf0c448661abc32c2b5c85b48580 | |
parent | becb6743f8197f53897cef1b2fda97f1784f961c (diff) | |
download | Nim-c3a9ac4d352a84fb47da0a4d5fc6f963b651bbec.tar.gz |
Try conversion to static[T] in generic instantation (#8443)
Fixes #8439
-rw-r--r-- | compiler/semcall.nim | 10 | ||||
-rw-r--r-- | tests/generics/t8439.nim | 10 |
2 files changed, 19 insertions, 1 deletions
diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 67fe99232..aa5394a71 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 000000000..69bd7cfcb --- /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]()) |