From 8a6b416c28d635365b2718021e0c4b34e9ec8a00 Mon Sep 17 00:00:00 2001 From: Jasper Jenkins Date: Wed, 1 May 2019 22:18:45 -0700 Subject: [PATCH 1/5] const named tuple unpacking --- compiler/semfold.nim | 2 +- tests/tuples/ttuples_various.nim | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/compiler/semfold.nim b/compiler/semfold.nim index 5fb2fcd658..3034ef9ccd 100644 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -701,7 +701,7 @@ proc getConstExpr(m: PSym, n: PNode; g: ModuleGraph): PNode = for i in countup(0, sonsLen(n) - 1): var a = getConstExpr(m, n.sons[i].sons[1], g) if a == nil: return nil - result.sons[i].sons[1] = a + result.sons[i] = a else: for i in countup(0, sonsLen(n) - 1): var a = getConstExpr(m, n.sons[i], g) diff --git a/tests/tuples/ttuples_various.nim b/tests/tuples/ttuples_various.nim index 94a2f3ff00..dc060da1e2 100644 --- a/tests/tuples/ttuples_various.nim +++ b/tests/tuples/ttuples_various.nim @@ -81,6 +81,27 @@ block unpack_const: doAssert z == 6 +# bug #10724 +block unpack_const_named: + const (a, ) = (x: 1, ) + doAssert a == 1 + + const (b, c) = (x: 2, y: 3) + doAssert b == 2 + doAssert c == 3 + + const (d, e, f) = (x: 4, y: 5, z: 6) + doAssert d == 4 + doAssert e == 5 + doAssert f == 6 + +block const_named: + const x = block: + (a: 1, b: 2, c: 3) + doAssert x.a == 1 + doAssert x.b == 2 + doAssert x.c == 3 + block tuple_subscript: proc`[]` (t: tuple, key: string): string = From 0add3a6dc0f9f3f5f38f190bda71938fef05ca7a Mon Sep 17 00:00:00 2001 From: Jasper Jenkins Date: Wed, 1 May 2019 22:37:38 -0700 Subject: [PATCH 2/5] enable t9177. --- tests/tuples/t9177.nim | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/tuples/t9177.nim b/tests/tuples/t9177.nim index d5768b7036..e6dd0cb1d2 100644 --- a/tests/tuples/t9177.nim +++ b/tests/tuples/t9177.nim @@ -1,6 +1,5 @@ discard """ action: run - disabled: true """ block: From ec099fc13ff188cb696af6f3524c75a8648d0391 Mon Sep 17 00:00:00 2001 From: Jasper Jenkins Date: Sun, 5 May 2019 01:15:31 -0700 Subject: [PATCH 3/5] handle separately in backends --- compiler/ccgexprs.nim | 2 +- compiler/jsgen.nim | 1 + compiler/semfold.nim | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index e03c4b1c14..4baa6795d6 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2850,7 +2850,7 @@ proc genConstSeqV2(p: BProc, n: PNode, t: PType): Rope = proc genConstExpr(p: BProc, n: PNode): Rope = case n.kind - of nkHiddenStdConv, nkHiddenSubConv: + of nkHiddenStdConv, nkHiddenSubConv, nkExprColonExpr: result = genConstExpr(p, n.sons[1]) of nkCurly: var cs: TBitSet diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index cd13aab78d..dc81b4e37c 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -2503,6 +2503,7 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) = of nkPragmaBlock: gen(p, n.lastSon, r) of nkComesFrom: discard "XXX to implement for better stack traces" + of nkExprColonExpr: gen(p, n.sons[1], r) else: internalError(p.config, n.info, "gen: unknown node type: " & $n.kind) proc newModule(g: ModuleGraph; module: PSym): BModule = diff --git a/compiler/semfold.nim b/compiler/semfold.nim index 3034ef9ccd..5fb2fcd658 100644 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -701,7 +701,7 @@ proc getConstExpr(m: PSym, n: PNode; g: ModuleGraph): PNode = for i in countup(0, sonsLen(n) - 1): var a = getConstExpr(m, n.sons[i].sons[1], g) if a == nil: return nil - result.sons[i] = a + result.sons[i].sons[1] = a else: for i in countup(0, sonsLen(n) - 1): var a = getConstExpr(m, n.sons[i], g) From d4167c3f8c813cbea7f6e4634cc577b4be14d253 Mon Sep 17 00:00:00 2001 From: Jasper Jenkins Date: Sun, 5 May 2019 03:46:02 -0700 Subject: [PATCH 4/5] make work again --- compiler/ccgexprs.nim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 4baa6795d6..be966671b4 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2708,6 +2708,7 @@ proc expr(p: BProc, n: PNode, d: var TLoc) = inc p.splitDecls genGotoState(p, n) of nkBreakState: genBreakState(p, n, d) + of nkExprColonExpr: expr(p, n.sons[1], d) else: internalError(p.config, n.info, "expr(" & $n.kind & "); unknown node kind") proc genNamedConstExpr(p: BProc, n: PNode): Rope = @@ -2850,7 +2851,7 @@ proc genConstSeqV2(p: BProc, n: PNode, t: PType): Rope = proc genConstExpr(p: BProc, n: PNode): Rope = case n.kind - of nkHiddenStdConv, nkHiddenSubConv, nkExprColonExpr: + of nkHiddenStdConv, nkHiddenSubConv: result = genConstExpr(p, n.sons[1]) of nkCurly: var cs: TBitSet From 1f207df7aef7dd469a998a4522891b25eab4c9df Mon Sep 17 00:00:00 2001 From: Jasper Jenkins Date: Sun, 5 May 2019 11:45:53 -0700 Subject: [PATCH 5/5] handle in semConst --- compiler/ccgexprs.nim | 1 - compiler/jsgen.nim | 1 - compiler/semstmts.nim | 3 ++- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index be966671b4..e03c4b1c14 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2708,7 +2708,6 @@ proc expr(p: BProc, n: PNode, d: var TLoc) = inc p.splitDecls genGotoState(p, n) of nkBreakState: genBreakState(p, n, d) - of nkExprColonExpr: expr(p, n.sons[1], d) else: internalError(p.config, n.info, "expr(" & $n.kind & "); unknown node kind") proc genNamedConstExpr(p: BProc, n: PNode): Rope = diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index dc81b4e37c..cd13aab78d 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -2503,7 +2503,6 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) = of nkPragmaBlock: gen(p, n.lastSon, r) of nkComesFrom: discard "XXX to implement for better stack traces" - of nkExprColonExpr: gen(p, n.sons[1], r) else: internalError(p.config, n.info, "gen: unknown node type: " & $n.kind) proc newModule(g: ModuleGraph; module: PSym): BModule = diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index b8f35408f6..a0a1caf7fd 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -641,7 +641,8 @@ proc semConst(c: PContext, n: PNode): PNode = addSon(b, copyTree(def)) else: setVarType(c, v, typ.sons[j]) - v.ast = def[j] + v.ast = if def[j].kind != nkExprColonExpr: def[j] + else: def[j].sons[1] b.sons[j] = newSymNode(v) addSon(result,b) dec c.inStaticContext