diff options
author | Clyybber <darkmine956@gmail.com> | 2019-09-28 19:50:20 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-09-28 19:50:20 +0200 |
commit | 85db42ad8c1a19ea47bd5826d8639e8974cc9042 (patch) | |
tree | 5d00473b4dbf1caeacddcc8a0b14467523c5e630 | |
parent | 5a65243e14773fc0d96bfd70429056dc5161df7f (diff) | |
download | Nim-85db42ad8c1a19ea47bd5826d8639e8974cc9042.tar.gz |
Fixes #10514 (#12268)
* Fixes #10514 (cherry picked from commit f6f789bb4db2a367384ba6ad75706edd503de1f8) * Add comment * Add changelog entry
-rw-r--r-- | changelog.md | 2 | ||||
-rw-r--r-- | compiler/semstmts.nim | 14 | ||||
-rw-r--r-- | tests/vm/teval1.nim | 15 |
3 files changed, 24 insertions, 7 deletions
diff --git a/changelog.md b/changelog.md index 290e2e73f..85e381342 100644 --- a/changelog.md +++ b/changelog.md @@ -11,6 +11,8 @@ ### Breaking changes in the compiler +- Implicit conversions for `const` behave correctly now, meaning that code like `const SOMECONST = 0.int; procThatTakesInt32(SOMECONST)` will be illegal now. + Simply write `const SOMECONST = 0` instead. ## Library additions diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 512dbca68..8acc5ce2f 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -595,11 +595,8 @@ proc semConst(c: PContext, n: PNode): PNode = if a.sons[length-2].kind != nkEmpty: typ = semTypeNode(c, a.sons[length-2], nil) - var def = semConstExpr(c, a.sons[length-1]) - if def == nil: - localError(c.config, a.sons[length-1].info, errConstExprExpected) - continue - + # don't evaluate here since the type compatibility check below may add a converter + var def = semExprWithType(c, a[^1]) if def.typ.kind == tyProc and def.kind == nkSym: if def.sym.kind == skMacro: localError(c.config, def.info, errCannotAssignMacroSymbol % "constant") @@ -621,7 +618,10 @@ proc semConst(c: PContext, n: PNode): PNode = def = fitRemoveHiddenConv(c, typ, def) else: typ = def.typ - if typ == nil: + + # evaluate the node + def = semConstExpr(c, def) + if def == nil: localError(c.config, a.sons[length-1].info, errConstExprExpected) continue if typeAllowed(typ, skConst) != nil and def.kind != nkNilLit: @@ -639,7 +639,7 @@ proc semConst(c: PContext, n: PNode): PNode = b.sons[length-2] = a.sons[length-2] b.sons[length-1] = def - for j in 0 .. length-3: + for j in 0 ..< length-2: var v = semIdentDef(c, a.sons[j], skConst) if sfGenSym notin v.flags: addInterfaceDecl(c, v) elif v.owner == nil: v.owner = getCurrOwner(c) diff --git a/tests/vm/teval1.nim b/tests/vm/teval1.nim index 5c323f0e7..0316ea238 100644 --- a/tests/vm/teval1.nim +++ b/tests/vm/teval1.nim @@ -25,3 +25,18 @@ doAssert x == "" static: var i, j: set[int8] = {} var k = i + j + +type + Obj = object + x: int + +converter toObj(x: int): Obj = Obj(x: x) + +# bug #10514 +block: + const + b: Obj = 42 + bar = [b] + + let i_runtime = 0 + doAssert bar[i_runtime] == b |