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

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] Check request: use `std::addressof` in generic code for objects of user-defined types
        </td>
    </tr>

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

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

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

<pre>
    
Because `operator&` may be overloaded, generic libraries use `std::addressof` to obtain addresses of objects of user-defined types.

```
template<typename T>
void process_0(T& a, int& b, int& c) {
    process_a(&a); // INCORRECT
    process_b(&b);                     // OK
 process_c(std::addressof(c));      // OK but redundant
}

template<typename T>
void process_1(T& a, int& b, int& c) {
    process_a(std::addressof(a));       // OK
    process_b(&b); // OK
    process_c(std::addressof(c));       // OK but redundant
}


void process_notemplate(int& a, int& b, int& c) {
 process_a(&a);                      // OK
    process_b(&b); // OK
    process_c(std::addressof(c));       // OK but redundant
}

template<typename T>
void process_pointers(T* a, std::unique_ptr<T>& b, T* c) {
    process_pointer_to_pointer(&a); // OK
    process_pointer_to_unique_pointer(&b);         // OK
 process_pointer_to_pointer(std::addressof(c)); // OK but redundant
}
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzElM-O2jAQxp9mcrFAzoT8O-QQ2EWqKnWl1d5XTjwBt8HO2g4SffoqECilsCD1UGSJEfq-8cyP8Qjn1EoTFRDPIX4KRO_XxhaS9E9jkfOgMnJXAC_nVIveEYOEm46s8MYCJpBwthE7VhEzW7KtEZIk4IKtSJNVNWtVZYVV5Nhodl5CVEJUCiktOWeaIYc3zFReKM3Gn8kx0zBTfafa78PekZ1IapQmyfyuIzcFXg4n4ePhpadN1wpPEC0GiRYbYm8QPQMvt0ZJ1llTk3PvHDB7A0yYGGpV2g9xdRbXgDmDdA68ZIydfAIwA0wEYA7RnAEuAZfsy7fFy-vr8-LtQl0d1NWovvYZM7x8HaxHXw2YXcGE2VDVebKTm1W9Z5Zkr6XQfoCSPh3oPEok_AciV2sVF7X-2eptSrdkD0N5hMpl99qcOGE2NvwIiBtzcf-v_s_9PzoVnVHak3WH4SgPTE5V9Fp99PTeeQvRYm8_otqLb0zMmPPdm2N49VH9BeDMd7z43H75yq6-rKt336N6l-fZAgpkEck8ykVARZhGMSYYp1GwLjAVWdjM6jqWlGGaC16FIm1mSElCjYgCVSDHWYiY8hAxjqY8zxLKwjCbhbWgXMKM00aodtq2283U2FWgnOupCDEMUwxaUVHrjmvcFoNqUvUrBzPeKufdb59Xvt0v_LoVejXxSu4gfmKLNdU_mKWPnpyHqPx8Yyt92vG1kcQaYz9f10Fv22LtfeeGbHumK-XXfTWtzQZwOZQ3fk06a4ZMgMt9jw5wOba5LfBXAAAA__8Z9_iz">