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

    <tr>
        <th>Summary</th>
        <td>
            [Clang][concepts] Conditional `explicit` specifier is checked too early in constrained constructor
        </td>
    </tr>

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

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

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

<pre>
    Repro:

```c++
template<class X>
constexpr bool is_int = false;

template<>
constexpr bool is_int<int> = true;

template<class X>
concept intish = is_int<X>;

template<class X>
constexpr X get5() {
    return X{5};
}

struct S { };

template<bool X>
struct enable_if { };

template<>
struct enable_if<true> {
    using type = int;
};

struct T {
#if 1
    template<intish X>
#else // ^^^ bug / fine vvv
    template<class X, 
             typename enable_if<is_int<X>>::type = 0>
#endif
    constexpr explicit(get5<X>() == 5) T(X) { }

    T(S) { }
};

static T u(S{});

```

Expected: *correct compilation*

Got:

```ps1
<source>:12:14: error: excess elements in struct initializer
    return X{5};
 ^
<source>:32:24: note: in instantiation of function template specialization 'get5<S>' requested here
    constexpr explicit(get5<X>() == 5) T(X) { }
                       ^
<source>:37:10: note: while substituting deduced template arguments into function template 'T' [with X = S]
static T u(S{});
         ^
```

Godbolt: https://godbolt.org/z/oc1P17Pss
Discovered in: https://github.com/microsoft/STL/pull/3323
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VUtv4zYQ_jXjy2ADibQs--BD_FqgaIFFk0NuC4oa2ezSpMpHXr--IK34kTrZ9rCCIBPkzDfzzXxjCu_V1hDNoVpAtRqJGHbWzX_7Q7xG90PRk5Kvo8a2L_M_qXcW-C0UKyjevpPi8Epgi_Tm3UD7XotAwJdSC-_xAfj6cCSt8YGee4eNtRqV_65MQOAr7IT2BHxxDn8G9DkC8GX-rjNUcPETpCspSeoDKhOU32WAI2i2-j9IQ2oPuKVQAZsCmyHUAwAioqMQncEHqBcV1KsTeL06j-KDizLgXXLGC7v3SeQqnHIYHMmIRtN31f0c4ENX4MtDJdeXFKJXZovhpadDsVKlzlhcBhpA708QwLjqsDzhneUy9OBEBxgn7QmBbYBtEKr14cUmbtMmdsoQPj4-XoV7axBb4un8-CQGRuzpgvG71q-T4PntkWxxkZlpVXcCPrWfnnutpArAplkHA9ogB75KSFVa3wObPgwawXcSSJDp_O7f51eqLIKSeI8xO9SLZMJm76yO03q-uX7uSQZqgd8isFtpnSMZUNp9r7QIyhpgFzP_1YaP_gV6P7QV-NLb6CQdKliy9BmnEOScdXnxLMl7JE17MsGjMjhoRRkVlNDqldzP5yZL4lpMnmKyHNPYpIbbFEIZH4QJKhND22EXjczrN9mg70nm8AcbYPXQw7vcwxod_R3JB2pxR45-Qf_x-vMh0zpVtzhn-rRTmtDHxgcVYkjz2lIbJbUnnsJt41vpg71SCGD1feIL1eJJhR0-5Am4g2r130R3JfFrAvxq28bqpCnchdD7JK487dvDwY11W2CbV2AbK8tvZf3N-4PnSnlpH8lRi8pc8VdhF5sbaffANnslnfW2C8A2d_e_A9v0UWtgG84ZH7Vz3s74TIxoXk5qNh1XrJqOdvOmbeV40rJGtqLgtZQTNqG2LCed6BrRjUdqzgrGi7IYl1U5Lqc3rGZVO5ENq5ty1vASxgXthdI3Wj_uE5WR8j7SvJpNWT3SoiHt3-5eN09GX5q49TAutPLBn9yCCjrf0kstzDY1oVoMV5eHaoVLa1qVGig0wqQ4SnBSHBTdKXKoPModyR9JB9YiCadf0lhk6TqhDLXDOspg3Sg6Pf-kqCm54edL7-xfJFN5M0EPbJM5_hMAAP__dA1qkg">