<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/144708>144708</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            CLang MSVC compatibility bug in return by register.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          technotopia
      </td>
    </tr>
</table>

<pre>
    Call from MSVC compiled code to CLang compiled method can result in access violation.

Condition: returned object is OK to be returned by register according to MSVC, but CLang assumes it should return a pointer on stack. Condition is described here:

https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170

POD object that fits size limitation and has no user defined constructor/destructor et.c

However, there is a problem with return of a class that has _default_ constructor and destructor:

```
//clang
class inlines_float_2
{
public:
        inlines_float_2() = default;
        ~inlines_float_2() = default;
        float val1;
        float val2;

        void set(float v1, float v2) { val1 = v1; val2 = v2; }
        bool less() const { return val1 < val2; }
        bool in(float v) const { return (val1 < v) && (val2 > v); }
};
```

```
//msvc
std::cout << "going to make 2 float struct with added default constructor/destructor. Should be bug:" << std::endl;
    auto if2 = factory::make_in_f2(dummy, v);
    std::cout << "got " << if2.val1 << ", " << if2.val2 << std::endl;

```

Disassembly of MSVC code, it expects return value in RAX:

<!-- Failed to upload "MSVC_CLang_rvalue_compatibility.zip" -->

Disassembly of CLang code, it expects arguments but tries to access uninitialized data.

> inlines_float_2 factory::make_in_f2(const std::vector<uint8_t>& dummy, const std::vector<float>& v)
> {
> 00007FFFF2DA1270  sub         rsp,48h  
> 00007FFFF2DA1274  mov qword ptr [rsp+20h],rcx  
> 00007FFFF2DA1279  mov         rax,rcx  
> 00007FFFF2DA127C  mov         qword ptr [rsp+28h],rax  
> 00007FFFF2DA1281 mov         qword ptr [rsp+40h],rcx  
> 00007FFFF2DA1286  mov         qword ptr [rsp+38h],r8  
> 00007FFFF2DA128B  mov         qword ptr [rsp+30h],rdx

---

Build options for MSVC project: 

/JMC /permissive- /ifcOutput "x64\Debug\" /GS /W3 /Gy /Zc:wchar_t /I"C:\dev\MSVC_CLang_rvalue_compatibility\" /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc143.pdb" /Zc:inline /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /arch:AVX2 /Gd /MDd /std:c++20 /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\MSVC_CLang_rvalue_compatibility.pch" /diagnostics:column 

Build options for CLang project:

/MP /GS /W3 /Gy /Zi /Od /D "_DEBUG" /D "CLANGLIB_EXPORTS" /D "_WINDOWS" /D "_USRDLL" /D "DATA_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /WX- /arch:AVX2 /Gd /MDd /std:c++20 /Fa"x64\Debug\" /EHa /nologo /Fo"x64\Debug\" /Fp"x64\Debug\clang_lib.pch" /diagnostics:column 

WinSDK: 10.0.19041.0

Built under Visual Studio Version 17.2.23

---

Bottom line: I'm not sure which compiler is wrong as having default constructor and destructor is not a clear case in standard - whether it counts as POD or not.
---

Attaching a simple solution that reproduces the crash

<!-- Failed to upload "MSVC_CLang_rvalue_compatibility.zip" -->
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysV0tz2zgS_jXwpUssEnofdJAoc8Y7Tpyykzg1FxUIQCJ2QIALgLKdw_72rQYpyS_Fs7WbSpkk1P31h36hwbxXOyPlgoxXZLy-YG2orFsEyStjg20UuyiteFrkTGvYOlvDp7vvOXBbN0pLAdwKCcFCfs3M7rRcy1BZAZwZcNK3OoAywDiX3sNeWc2CsiYh6ZKky9waofCbDJfgZGidkQJs-U_JAygPN3-ggVKefiufwMmd8kE6BLVOKLNDIeRGaA5lG3pGzPu2lh5UAF_ZVoseBRg0VhlEsAZ8YPyvBI5M0KyQnjtVSgGVdJIMlx3bKoTG4xctCC20ZM4kteLOersNCbc1oYU0g9YTWvCmIbQoW6UFocXjZDTgTGtldgNuzV6abtPFXskHMlzXfs8H2TTt7Hy5WR98ECoWYKuCB69-StCqViE6EJgRUDEPxkLrpQMht8rEqBgfXMuDdYQWQh4-QIaEd_i_2we5lw69FXCDuGUGjbOlljU8qFAdPGW3wIBr5n3HBA1uhNyyVofNc1ORzsnY0WVkkvb_095tXDOzI-myQ1VGKyP9ZqstCxuKUtMVSZdNW2rFDzDz12J0RugcyHANPRkyXHWS__77olEC9kxnb5foYQlX91YJ8DIQOusFMvRd_04j_nQVkaKhPQJGlO4TwYBM1x1aaa0GLb3vqUUvRoDe6T1OfuDxSlWZE4939QmdnSAiOTohdNKvI6fLuP4Merru9_s8XO9FDxOVpEsfBMZmuOS2DWgIbRFKd7avxpr9JYH2LuqyokssJoQUh1CcTdYE7rqKLSWU7S7WHD3YORqXRuiONwAAa4MFte18vmUI89TJIZmNMpstZoNo6_oJw9e7oNc-v6MAz2yrLU0Ozu0lEOutxK_YvnX0WnnmvaxL_YQ11_dZIRFbBZCPjeTBP0uQVmJXvV3-OFXaMCc0GwygYLENBwttoy0TSA4BN7ErblzU3mC7ZkGVSqvwlPxUDW5hMCDDy3cZHXr8G0rM7dpamuBj4w1OSY-m-37fGmVUUEyrnxh1FlhyYHv5uvZ_EbMuxY-e3Muux-StMmG2CUiaTuAY2XPi0VAvHKPf8eg6Dr6laZpOi6Io6HqZ0WkK4NsSDv-cbwjNR7MK4H35EUBt9_CvB-sENMEBGa-i0oqmFRmvCc0dfzynPe-0j9bY46_l85fy71mdHayycyiz7COQ0cfUZ5MPqQyPVGbnQFYfgxypiMcujQaDQfeywoMWbINHo4etdV0NNc7iMYrTRZ93tPjHJ6zXopGuVt6rvRzgp9rymzY0baz2x8mIjPO1xNYzzmNx0-K3O_x7P4zvT_j3TzygHnjF3AbViitCaY45N86F3JNx_kHZnbD_vIqodaRygyVbeKHxUYg3fPY8Gw2TRpQHZaTRFRN-rnEHm_Xl6ttvvUC3kt98vru5vnyx9u3zVX6zfrH2ckk6Z92tbKxDJzbO1k3c6v2PwdH01ro7bpto_PZrnuGTOV6R4XL5_Ufnu7ilT-tuZ7EwOaGrWBlxlzEkBTvn-8vfPcensdrubJS152SL5s0vH7W_hle9slBsZ6wPivt4Fui2NnAuxbqmeMqxY4p9-nImYdQpvmfClF8vP_92fbXaXP74cnP79e5FuO6vPq9v7l-ufbu7XV9fP19aL78uz6q_FP04AfpA_7fx_EUk2f8QyDg8brQq_17I7pW5W_-B1Z-lSZpk83SUJekpnAFaI6SD78q3TMNdaIWy8F06jxN2Nk1oQoevO40NwdaA1YbAV4ROazA2gG-dhIdK8epwF3I4WD84G-8iULE9DkfvjD6vhmfUQkCcvCVzwJmPp70PzAjmBAzgoZI4ueNBzG2Lpy_zEK8NDlWT54SXITBeoWkGXtWNluCtbuMlIg71TjbOipbjyV1J4I756v88U1yIxVDMh3N2IRfZdJzS8Xg6Gl5Ui_lkm41Ggm_ndEqz2ZRLykRJ54IJORyL2YVa0JSO00k2y0bpPKVJNpyn5XSSZaP5LC23goxSWTOlE633dWLd7kJ538pFNhpN09mFZqXUPl5xKe3uHpTibdctUGFQtjtPRqlWPvgTRFBBy0VX38dL73FrOJJiQPpx7NmVNLlonV68vCfuVKjasr8eooX-MTg0DlpExnhr7EnvF_Q_AQAA___73a64">