From 2bea2bdbbf0b709811203f64d07ba6ddf3e90cc7 Mon Sep 17 00:00:00 2001 From: Kier Davis Date: Sat, 30 Jul 2016 14:22:24 +0100 Subject: [PATCH] Locate 'attempt to redefine' errors at the import statement rather than at the first line of the imported module. Fixes #4541. --- compiler/importer.nim | 6 +++--- compiler/lookups.nim | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/compiler/importer.nim b/compiler/importer.nim index 5ffe127281..dd2c4d9545 100644 --- a/compiler/importer.nim +++ b/compiler/importer.nim @@ -176,7 +176,7 @@ proc evalImport(c: PContext, n: PNode): PNode = var m = myImportModule(c, n.sons[i]) if m != nil: # ``addDecl`` needs to be done before ``importAllSymbols``! - addDecl(c, m) # add symbol to symbol table of module + addDecl(c, m, n.info) # add symbol to symbol table of module importAllSymbolsExcept(c, m, emptySet) #importForwarded(c, m.ast, emptySet) @@ -186,7 +186,7 @@ proc evalFrom(c: PContext, n: PNode): PNode = var m = myImportModule(c, n.sons[0]) if m != nil: n.sons[0] = newSymNode(m) - addDecl(c, m) # add symbol to symbol table of module + addDecl(c, m, n.info) # add symbol to symbol table of module for i in countup(1, sonsLen(n) - 1): if n.sons[i].kind != nkNilLit: importSymbol(c, n.sons[i], m) @@ -197,7 +197,7 @@ proc evalImportExcept*(c: PContext, n: PNode): PNode = var m = myImportModule(c, n.sons[0]) if m != nil: n.sons[0] = newSymNode(m) - addDecl(c, m) # add symbol to symbol table of module + addDecl(c, m, n.info) # add symbol to symbol table of module var exceptSet = initIntSet() for i in countup(1, sonsLen(n) - 1): let ident = lookups.considerQuotedIdent(n.sons[i]) diff --git a/compiler/lookups.nim b/compiler/lookups.nim index ba2358b86a..de43c4e4a3 100644 --- a/compiler/lookups.nim +++ b/compiler/lookups.nim @@ -162,6 +162,10 @@ proc wrongRedefinition*(info: TLineInfo, s: string) = if gCmd != cmdInteractive: localError(info, errAttemptToRedefine, s) +proc addDecl*(c: PContext, sym: PSym, info: TLineInfo) = + if not c.currentScope.addUniqueSym(sym): + wrongRedefinition(info, sym.name.s) + proc addDecl*(c: PContext, sym: PSym) = if not c.currentScope.addUniqueSym(sym): wrongRedefinition(sym.info, sym.name.s)