diff options
-rw-r--r-- | compiler/cgen.nim | 9 | ||||
-rw-r--r-- | tests/ccgbugs/twrong_method.nim | 27 |
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 |