summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/astalgo.nim8
-rw-r--r--compiler/lookups.nim2
-rw-r--r--tests/errmsgs/t10251.nim21
3 files changed, 20 insertions, 11 deletions
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim
index 5af8caad8..3c97665f0 100644
--- a/compiler/astalgo.nim
+++ b/compiler/astalgo.nim
@@ -759,9 +759,9 @@ proc strTableAdd*(t: var TStrTable, n: PSym) =
 
 proc strTableInclReportConflict*(t: var TStrTable, n: PSym;
                                  onConflictKeepOld = false): PSym =
-  # returns true if n is already in the string table:
-  # It is essential that `n` is written nevertheless!
-  # This way the newest redefinition is picked by the semantic analyses!
+  # if `t` has a conflicting symbol (same identifier as `n`), return it
+  # otherwise return `nil`. Incl `n` to `t` unless `onConflictKeepOld = true`
+  # and a conflict was found.
   assert n.name != nil
   var h: Hash = n.name.h and high(t.data)
   var replaceSlot = -1
@@ -780,7 +780,7 @@ proc strTableInclReportConflict*(t: var TStrTable, n: PSym;
     result = t.data[replaceSlot] # found it
     if not onConflictKeepOld:
       t.data[replaceSlot] = n # overwrite it with newer definition!
-    return result
+    return result # but return the old one
   elif mustRehash(t.data.len, t.counter):
     strTableEnlarge(t)
     strTableRawInsert(t.data, n)
diff --git a/compiler/lookups.nim b/compiler/lookups.nim
index 9dac106e4..f72b58ac6 100644
--- a/compiler/lookups.nim
+++ b/compiler/lookups.nim
@@ -293,6 +293,8 @@ proc wrongRedefinition*(c: PContext; info: TLineInfo, s: string;
       "redefinition of '$1'; previous declaration here: $2" %
       [s, c.config $ conflictsWith])
 
+# xxx pending bootstrap >= 1.4, replace all those overloads with a single one:
+# proc addDecl*(c: PContext, sym: PSym, info = sym.info, scope = c.currentScope) {.inline.} =
 proc addDeclAt*(c: PContext; scope: PScope, sym: PSym, info: TLineInfo) =
   let conflict = scope.addUniqueSym(sym)
   if conflict != nil:
diff --git a/tests/errmsgs/t10251.nim b/tests/errmsgs/t10251.nim
index 5ad373ba3..0c7fe0b3d 100644
--- a/tests/errmsgs/t10251.nim
+++ b/tests/errmsgs/t10251.nim
@@ -1,12 +1,19 @@
 discard """
-errormsg: "redefinition of 'foo'; previous declaration here: t10251.nim(9, 9)"
-line: 11
-column: 9
+  action:reject
+  cmd: "nim check $options $file"
+  nimout: '''
+t10251.nim(15, 5) Error: redefinition of 'foo'; previous declaration here: t10251.nim(13, 5)
+t10251.nim(19, 23) Error: redefinition of 'goo1'; previous declaration here: t10251.nim(19, 11)
+'''
 """
 
+# line 10
 type
-    Enum1 = enum
-        foo, bar, baz
-    Enum2 = enum
-        foo, bar, baz
+  Enum1 = enum
+    foo, bar, baz
+  Enum2 = enum
+    foo, bar, baz
 
+type
+  Enum3 {.pure.} = enum # fixed (by accident?) in https://github.com/nim-lang/Nim/pull/18263
+    goo0, goo1, goo2, goo1