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

    <tr>
        <th>Summary</th>
        <td>
            Using `auto` keyword bypasses `if constexpr` validation rules
        </td>
    </tr>

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

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

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

<pre>
    The following code compiles correctly (https://godbolt.org/z/98dr4bsT8):
```c++
#include <type_traits>
template <typename T>
class raw_ptr {
 public:
  T* get() const { return nullptr; }
  void ReportIfDangling() const {}
 operator T*() const { return nullptr; }
};

template <typename T>
struct IsRawPtr : std::false_type {};

template <typename T>
struct IsRawPtr<raw_ptr<T>> : std::true_type {};

template <typename T>
inline constexpr bool IsRawPtrV = IsRawPtr<T>::value;

template <typename T>
class UnretainedWrapper {
 public:
  T* get() const {
    // `ptr_` is either a `raw_ptr` or a regular C++ pointer.
    if constexpr (IsRawPtrV<StorageType>) {
 const auto& type = ptr_;
        type.ReportIfDangling();
    }
 return ptr_;
  }

  using StorageType = T*;
//   using StorageType = raw_ptr<T>;
  StorageType ptr_;
};

int main() {
  UnretainedWrapper<int> w;
  w.get();
  return 0;
}
```
 Although, this doesn't respect https://en.cppreference.com/w/cpp/language/if:
> Outside a template, a discarded statement is fully checked

Changing the `get` method to:
```c++
  T* get() const {
    // `ptr_` is either a `raw_ptr` or a regular C++ pointer.
    if constexpr (IsRawPtrV<StorageType>) {
 ptr_.ReportIfDangling();
    }
    return ptr_;
 }
```

will have the expected behaviour.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVk2PIjcQ_TXmUlpkbGjgwIGBQdpTos1schy57aLbWWNbdjUs-fWRaT5nd5VM9hTUAmSX672qelVtlbNtPOKCTZ7YZD1QHbUhLaLqXMYdukEdzHHx0iJsg3PhYH0DOhgEHXbROsygQ0qoyR2BiVlLFDOTSyY2TGyaYOrgaBhSw8TmLyY285lJ4zq_zJiYFzO-ZnzJKt4_momn8vSrQlqvXWcQmFzRMeIrJWUpM_ncWxDuolN03fdqh_By3dZO5QxJHV4jJWDTs1-IXe2svqIDvDCxhAaJiUILdPCZij0kpC558J1zkRKTT8Cm68upfbAGPmEMiT5u18o3zvrmrYubfYiYFIV0QnsPUvkjLzn5N3FnSp0m-Jg_qcOvJXK5hEymBCyXW-UyvpZTF3o_45vJ1Tm_TK5OVvL5EY9S9xNw1jvrsc8Tfo0J6hDcFf13YHJ9z6VnUGD3ynX4PqxeLp99QlLWo_kjqRjxPwnnsg_Q9wGwikdKr6ziYDOgpRYTqLJ8SV_FIZSlhE3nVIJV3woQg_WEaXhzabd3-WBids0Gk6vfKCTV4MsxYolLzO_Y9OxUR4GJCvqSyDWceMk7yuVTdoff1_aD7U3eZwG_8XYT8Xmhy2WA3NE8cTi1xLVYfcp-ZPtWb1ese8MHGt-qznqCnbL-XLe7in1TfiZX1lOR9eEO6zC8Vv1u9ZwD_oD8OOHOpktHbeialokVUGszmIDZMzElSJgjaoLHSYp-qGNMuMWEXuNQhx0TmwMTGx0jExunfNOpBpnY2O1tsMpn-KWjbA2Cgov-C6gCY7NWyaCBTIpwh56KNredc0fQLeovaO5ztmqVb0pBqMUi3JKAisMOqQ0GKPzDNP-fNUsh8L4GAPh-D_xIA_33wToHrdrjKa34tZQeDdTYqr0NXRoOzEKauZyrAS5G1XQmpzMuxaBdVHOOo9lE83E13463fFtxOR3VNZ8Yoc10MrALwYXkks9HFZ-OxHCKk7HeSolyxCfC1GzMcaesGzq335V39MDm3OGiGknOB07V6PLpWiCELvoqb48UPKE3TIhyWUiLcvRD3TWZjbmzmfLNGVlyuPh8amJW8dPgqTh8weMhJAP1MaqcMZe9-yoVm71y1iiywUPqHOZBl9zizdXCUtvV5z4omOefDzGFP1FTaYQSTWZicwro7wAAAP__Ryamkw">