diff options
author | Jason Beetham <beefers331@gmail.com> | 2021-07-27 01:36:59 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-27 09:36:59 +0200 |
commit | ed44618deb7173ecfe41420fc90871b83a0d08ca (patch) | |
tree | d554d47f13d3a5b712e8c40182f1deeb411162e8 | |
parent | fa0209609d3bedd3466f162aa350d261907851ce (diff) | |
download | Nim-ed44618deb7173ecfe41420fc90871b83a0d08ca.tar.gz |
Fixed const tuples in inferred generics (#18598)
-rw-r--r-- | compiler/semgnrc.nim | 33 | ||||
-rw-r--r-- | tests/tuples/tinferred_generic_const.nim | 14 |
2 files changed, 30 insertions, 17 deletions
diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index 4f3c50dae..3df1e0c3f 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -391,16 +391,24 @@ proc semGenericStmt(c: PContext, n: PNode, a[^1] = semGenericStmtScope(c, a[^1], flags, ctx) closeScope(c) - of nkVarSection, nkLetSection: + of nkVarSection, nkLetSection, nkConstSection: + let varKind = + case n.kind + of nkVarSection: skVar + of nkLetSection: skLet + else: skConst for i in 0..<n.len: var a = n[i] - if a.kind == nkCommentStmt: continue - if (a.kind != nkIdentDefs) and (a.kind != nkVarTuple): illFormedAst(a, c.config) - checkMinSonsLen(a, 3, c.config) - a[^2] = semGenericStmt(c, a[^2], flags+{withinTypeDesc}, ctx) - a[^1] = semGenericStmt(c, a[^1], flags, ctx) - for j in 0..<a.len-2: - addTempDecl(c, getIdentNode(c, a[j]), skVar) + case a.kind: + of nkCommentStmt: continue + of nkIdentDefs, nkVarTuple, nkConstDef: + checkMinSonsLen(a, 3, c.config) + a[^2] = semGenericStmt(c, a[^2], flags+{withinTypeDesc}, ctx) + a[^1] = semGenericStmt(c, a[^1], flags, ctx) + for j in 0..<a.len-2: + addTempDecl(c, getIdentNode(c, a[j]), varKind) + else: + illFormedAst(a, c.config) of nkGenericParams: for i in 0..<n.len: var a = n[i] @@ -410,15 +418,6 @@ proc semGenericStmt(c: PContext, n: PNode, # do not perform symbol lookup for default expressions for j in 0..<a.len-2: addTempDecl(c, getIdentNode(c, a[j]), skType) - of nkConstSection: - for i in 0..<n.len: - var a = n[i] - if a.kind == nkCommentStmt: continue - if (a.kind != nkConstDef): illFormedAst(a, c.config) - checkSonsLen(a, 3, c.config) - addTempDecl(c, getIdentNode(c, a[0]), skConst) - a[1] = semGenericStmt(c, a[1], flags+{withinTypeDesc}, ctx) - a[2] = semGenericStmt(c, a[2], flags, ctx) of nkTypeSection: for i in 0..<n.len: var a = n[i] diff --git a/tests/tuples/tinferred_generic_const.nim b/tests/tuples/tinferred_generic_const.nim new file mode 100644 index 000000000..5ab730c38 --- /dev/null +++ b/tests/tuples/tinferred_generic_const.nim @@ -0,0 +1,14 @@ +discard """ + action: run +""" +block: + proc something(a: string or int or float) = + const (c, d) = (default a.type, default a.type) + +block: + proc something(a: string or int) = + const c = default a.type + +block: + proc something(a: string or int) = + const (c, d, e) = (default a.type, default a.type, default a.type) |