summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--changelog.md2
-rw-r--r--compiler/semstmts.nim14
-rw-r--r--tests/vm/teval1.nim15
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