<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62538>62538</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] Invalid 32bit pointer (-fms-extensions __ptr32 __uptr) on non-Windows platforms
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
d-mozulyov
</td>
</tr>
</table>
<pre>
### Problem
32-bit pointer does not work correctly on non-Windows platforms. See the [Godbolt listing](https://godbolt.org/z/PfncW85xG).
![screen_small](https://user-images.githubusercontent.com/10961593/236072539-ebcddc5f-a026-4c22-82ef-416b076a379e.png)
### Sample
```cpp
int param_std(int* foo) {
int temp = *foo;
*foo = 1;
return temp;
}
int param_ptr32(int* __ptr32 __uptr bar) {
int temp = *bar;
*bar = 2;
return temp;
}
int emulate_ptr32(unsigned baz) {
unsigned long long baz64 = baz;
int* bazptr = (int*)baz64;
int temp = *bazptr;
*bazptr = 3;
return temp;
}
struct Qux {
int* __ptr32 __uptr value;
};
int struct_ptr32(Qux& qux) {
int temp = *qux.value;
*qux.value = 4;
return temp;
}
```
### Conclusions
The `param_ptr32` disassembler must be equal to `emulate_ptr32`, like `struct_ptr32`, and different from `param_std`. Based on the [Godbolt listing](https://godbolt.org/z/PfncW85xG), the MSVC and Clang for Windows target (x86_64-windows-gnu) compilers do just that. But on non-Windows platforms, Clang may not do the important conversion from a 32-bit pointer to a 64-bit one. I have localized this behavior in two cases. First, if the pointer appears as a function argument (`param_ptr32`). Second, if it is a member of a small structure that is passed as an argument (change `Qux& qux` to `Qux qux`).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVc2O2zgMfhrlQthw5J_YhxxmOkjRwwItZrE9BrJEO2plydVPJpOnX8hOMkmmRdHFAoadkBT5kfxIMedkrxHXpHwk5dOCBb8zdi2SwRyDejX7RWvE65rQfH7gszWtwoFkTyR7yGnSSg-jkdqjBWHQgTYeXoz9DtxYi9yrVzAatNHJV6mFeXEwKuY7YweXwjMi-B0CKR8_GtEa5UFJ56XuSflEaL3zfnQkfyB0Q-imn01SY3tCN0dCN587zb_W5eEjoU06Yzq96ZKUj45bRL11A1PqZw6DQ5vIgfXo0l76XWijhBvtUfuUm4HQzTJrqmXZ5IRuaF5lK1rmTYItF4KXXcIyWiUFpzSpKXZJsazabFWxfNVgOuqe0OYW1bmMz2wYFZ6kVTY_fBxnidQeRmbZsHVeEFpL7Ql9gM4YQhsgq8fZDAAgmnocRiD5ExD6EG3ys37-P6mWb1IAsOiD1dPBi5ysnq6xvmEYvc3pG4rtLIDtNozeQsvsb0FFm-vws2jS0v-CC4egmMcLsqAnFgto2fEdmItSGd3Pr5Ydq2IKHw_kt8hjji07xtxm-KfECW2mc_f2d5nGgzcduPKV_2myztvAPXwJh3cF_kkr9kwFvHF1-X0p3ezxUrkv4UBoBT_i5zdN_BEO6W2EUysvismy-IMcz8S_n44PRnMVnDTazaq_446osms-VhkI6ZhzOLQKLQzBeWgR8EdgCryJ9rc8qTJCP4CS3ydfN4WYVUwLELLr0KL20FkzvAWNg1hlKTwyhyJutP9rbcXA0ddfz__MCD4opnvojIXzwvTM9ugjEw91ta2K5GVWJL0OsW3cDKNUaB0IA99iHfyO-RQeg__l7o1h50gDe52WtjATDjmMxnqmPXCj92hjF-ZaMLjb994Ag6qYZEZjCp9gx_YIynCm5BEF-J100OKO7aWxIDX4FwOcOXQpbKR1PsKQ3RT47JWNIzLrgDlg0AXNfUTAbB-G2BZC63dMiNsfnpEbLU4OpQcZzw84tGjBdMBgugZOAxAsTkWKVmMkkZji3cbhO6b7iSxXY1JlJ3LFoZwFMfxCrHPR5A1b4HpZ1fmyXJW0WOzWq2VNO1rklIklLUosVtMFQetGFFVR8oVc04zmWZnlNC9KWqScd00hynpVVLxteU2KDAcmVarUfogsWkjnAq4rWub1QrEWlTvf33YdjZI29I4UWSSlezvmpVfTTc9j40n5BJ_0nikpIKfXfSW0TrrBJXjwqKcpvNs0kXS_ItYiWLW-G4Dpaj3dpxHN6ZOM1nxD7gndTBk5QjdTUv8GAAD__5CLnp8">