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

    <tr>
        <th>Summary</th>
        <td>
            Wrong evaluation of a `if constexpr requires`
        </td>
    </tr>

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

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

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

<pre>
    The following program

```
#include <array>
#include <vector>

template <typename T>
constexpr std::size_t get_length(const T &t) {
    return t.size();
}

template <typename T, std::size_t N>
constexpr auto get_length(const std::array<T, N> &) {
    return std::integral_constant<std::size_t, N>();
}

static_assert( get_length(std::array<int, 3>())() == 3 );
static_assert( requires { typename std::array<int, get_length(std::array<int, 3>())>; } );

auto foo(auto length) {
 // If length could be evaluated at compile time,
    if constexpr (requires { typename std::array<int, length>; })
        return std::array<int, length>{};
    // Otherwise,
    else
        return std::vector<int>(length);
}

int main() {
    auto x = foo(get_length(std::vector<int>(5)));
    x.resize(1); // array does not have resize
    auto y = foo(get_length(std::array<int, 3>()));
 static_assert( y.size() == 3 ); // in Clang y is vector?
}
```

is accepted by GCC and MSVC. But in Clang `y` is a `std::vector` for some reason. Online demo: https://gcc.godbolt.org/z/h53zc3bjv

Related discussion: https://stackoverflow.com/a/76673819/7325599

Could you please check?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyclUtv4zYQxz_N-DJYQyZtST7okMirood2gTZojwFFjSXuUqRLUk6cT19IlvxM0gegMBLI-c9vXrTwXtWGKIPVI6w2M9GFxrqsoMrNSlsdsqeGcGu1ti_K1LhztnaihWgD0cO4xtH4HD8ZV0bqriIEngvnxAH41_f29iSDdefNYQ3U7rQIw4Fw2JERLeHT6ZC0xgd63Tn0oQL-APzBqzd6DlhTeNZk6tAAS4dj-ITA4gBsjZA8Hu0RER2FzhkM894SWApsDXzch2TzL2hYfuf-13cQRRfse1wn2zE7-aDYK_TAH_GerJQJVDuhnwc1YQLw_AZn0vs8Oh9EUPJZeE8uAEuvWe8olRl0-Vm3f9KBl2-Ab5Djpbc7eUd_dcqR78PDUzo_8vM_YPhX4I8IyeaK47gOxdhaCywdXifpy2QDK4AV-PN23EVpO11hSUh7oTsRqEIRUNp2pzRhUC0By8-VUls8Vx9Y-t8CHolOQfQxnKTfa4QP7ZPH3pxf9NAY2bfQkHtR_hqbtKfPPU2jOrgaMn5K30fNpUzAVigzdchlRw8FeO27ZqzI-7W-97qaum59Fd3r3NE4zIvj3hTwkCKsLHk0NmAj9oTj2Wuawz_SfD4GF0B3fX-4uGluR2UCVQZzLUyNB1Qep8iL29Te3LXHTHsUUtKu787ygD_lOQpT4S-__5HP8bELZ22IowPEUe9B9B-3mY4j3FqH3rZ9loS3Zo7fjFaGsKLWAn_AJoSd740G7FrKeW2r0uowt64GVrwBK5oVf5O8_L6_pPyN9DA_lfKy815Zcy_ng5A_7J7cVtuXubQtsEIAK5I4Tni6WPevnK1W6_Wlcj4M6cF2uNMkPKFsSP4AXsyqjFdrvhYzyhZxumacxWwxa7JELMUirraVXEVJkiZrkknKS5JpXEZLuZypjEWMR8mi_0uixTxNkmgRJ0sRs6qq4gqWEbVC6bnW-7YPfaa87yiLebpczbQoSfvpJ9Vl_aEvZVd7WEZa-eDPZkEFTdmfzpp6umSUNWi3xwpd3SjTdQJxNOuczm5qoULTlWPWev3x35eds99JBmDFwOiBFQPm3wEAAP__7wZY1w">