https://issues.dlang.org/show_bug.cgi?id=18928
--- Comment #3 from Manu <turkey...@gmail.com> --- You'll have to relate these 2 lines to the .cpp file (attached) in main() Calling code in main(): // static call... auto x = addUser(test, "test"); 00007FF74843C587 lea rdx,[string "test" (07FF748448D44h)] 00007FF74843C58E mov rcx,qword ptr [test] 00007FF74843C592 call addUser (07FF74840C735h) 00007FF74843C597 mov dword ptr [rbp+104h],eax 00007FF74843C59D mov eax,dword ptr [rbp+104h] 00007FF74843C5A3 mov dword ptr [x],eax // virtual call... x = test->addUser("test"); 00007FF74843C5A6 mov rax,qword ptr [test] 00007FF74843C5AA mov rax,qword ptr [rax] 00007FF74843C5AD lea r8,[string "test" (07FF748448D44h)] 00007FF74843C5B4 lea rdx,[rbp+124h] // what is? RVO return address? 00007FF74843C5BB mov rcx,qword ptr [test] 00007FF74843C5BF call qword ptr [rax] 00007FF74843C5C1 mov eax,dword ptr [rax] 00007FF74843C5C3 mov dword ptr [x],eax This is the C++ code calling into D; it appears C++ makes a static call differently to a virtual call? I suspect RDX in the virtual call is the RVO return address? I wonder why the static-call doesn't follow the same call convention? I can attach the DMD disassembly? But it's probably easier to build that yourself. This might reveal that the VC ABI has RVO rules that we don't understand? --