summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/cgen.nim9
-rw-r--r--tests/ccgbugs/twrong_method.nim27
2 files changed, 32 insertions, 4 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index 7fef34a27..decbe55c3 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -595,7 +595,7 @@ proc cgsym(m: BModule, name: string): Rope =
 
 proc generateHeaders(m: BModule) =
   add(m.s[cfsHeaders], tnl & "#include \"nimbase.h\"" & tnl)
-  
+
   for it in m.headerFiles:
     if it[0] == '#':
       add(m.s[cfsHeaders], rope(it.replace('`', '"') & tnl))
@@ -1377,9 +1377,10 @@ proc myClose(graph: ModuleGraph; b: PPassContext, n: PNode): PNode =
   registerModuleToMain(m.g, m.module)
 
   if sfMainModule in m.module.flags:
-    incl m.flags, objHasKidsValid
-    var disp = generateMethodDispatchers(graph)
-    for i in 0..sonsLen(disp)-1: genProcAux(m, disp.sons[i].sym)
+    if m.g.forwardedProcsCounter == 0:
+      incl m.flags, objHasKidsValid
+    let disp = generateMethodDispatchers(graph)
+    for x in disp: genProcAux(m, x.sym)
     genMainProc(m)
 
 proc cgenWriteModules*(backend: RootRef, config: ConfigRef) =
diff --git a/tests/ccgbugs/twrong_method.nim b/tests/ccgbugs/twrong_method.nim
new file mode 100644
index 000000000..9879c6114
--- /dev/null
+++ b/tests/ccgbugs/twrong_method.nim
@@ -0,0 +1,27 @@
+discard """
+  cmd: "nim c -d:release $file"
+  output: '''correct method'''
+"""
+# bug #5439
+type
+  Control* = ref object of RootObj
+
+  ControlImpl* = ref object of Control
+
+  Container* = ref object of ControlImpl
+
+  ContainerImpl* = ref object of Container
+
+method testProc*(control: Control) {.base.} = echo "wrong method"
+
+method testProc*(container: Container) = echo "correct method"
+
+proc main()
+
+main() # wrong method called
+
+proc main() =
+  var container = new ContainerImpl
+  container.testProc()
+
+# main() # correct method called