<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60710>60710</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang incorrectly instantiates conditional-explicit even when constraints are not satisfied
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:frontend,
rejects-valid
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ldionne
</td>
</tr>
</table>
<pre>
In code like the following, Clang will instantiate the content of the conditional-explicit even when the constraint is not satisfied:
```
template <some-constraint T>
explicit(some-expression-involving-T)
constructor(T const&) { }
```
As a result, if `some-expression-involving-T` is not well-formed, Clang will issue a hard error even if `some-constraint` is not satisfied, in which case one would have expected that the constructor is removed from the overload sets instead.
Full reproducer:
```
// clang++ -xc++ - -std=c++2b -fsyntax-only
#include <type_traits>
#include <utility>
template <class ...T>
struct tuple { };
template <class T> struct IsPairLikeImpl : std::false_type { };
template <class T1, class T2> struct IsPairLikeImpl<tuple<T1, T2>> : std::true_type { };
template <class T> concept IsPairLike = IsPairLikeImpl<T>::value;
template <class ...T>
constexpr auto f(tuple<T...> const&) {
static_assert(sizeof...(T) == 2);
}
template <class T1, class T2>
struct pair {
template <IsPairLike P>
explicit(std::is_void_v<decltype(f(std::declval<P>()))>)
pair(P const&) { }
};
template <class T>
concept can_construct_pair_from = requires (T t) {
pair<int, int>(t);
};
static_assert(!can_construct_pair_from<tuple<int>>);
static_assert( can_construct_pair_from<tuple<int, int>>);
static_assert(!can_construct_pair_from<tuple<int, int, int>>);
int main() { }
```
Godbolt link: https://godbolt.org/z/7PjGqdjes
GCC and MSVC accept this code, Clang doesn't. This was discovered while trying to implement `pair-like` constructors for libc++.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVltv6jgQ_jXmZZQocQqBBx4oLEdH2pUqbbWvyNgTcOvYObYTyvn1KztcAr2cVijNZfzNN9-MZ8yckzuNOCfjRzJejVjr98bOlZBGaxxtjTjOf2rgRiAo-Yrg9wiVUcocpN4RuoSlYnoHB6kUSO08014y39txoz1qD6Y6PwrppdFMJfjWKMmlB-xQw2GP-mzivGVSe5AOtPHgmJeukihIsSDZimTn6yQ7_eKjx7pRwS8pls7UmAyQnknxV28FZ7eETqMVvjUWnZNGJ1J3RnVS75JnQme9fQ_Scm8sodPnnh6hE0JnQMpHIOXqQzb9deGAgUXXKh-EkhWQSfaV20l2jvqASiWVsTWKe42daxEY7JkVgNYa20s4QL-GPkC86hioBMkl3wNnDsFohINplYA96zBohNyjAL9nfpCVKEOAs1ibDgVU1tTxu-nQKsMEOPQuVgEykQ6lWLdKgcXGGtFytF_nktA1oWvgIWhCHwl9hOSNn-8gcV6QYnV6QbeQVO6oPXtLjFbHM0QhNVetiAXhjw1ugiLeXUrh1qL1Ukl_vH59V1RcMecgTdNrNfWagG8bhZdyKB6_RgjLYfB3Avnpnpi0f8tX_Fk3CkixgBjmghSLiimHmxDEOy8f4Ochwad7Gpx96CGoEniTYtmviLbB_Ma1t-33PYfV3GiOzdAbkGL13nlUMbromGrxj7LdCB_rMewhYK03UBE6vQSTpumJx3Cnnra_88xLvmHOoY09QP5GU4UldPocTYtVoEtDB7hQumzy70p-Ux4Nk3ZAAQCGCAOdnj5uU-dUSLfpjBSbjhRLgVyFrBA6rYY24X3Hgr4RjE5DHP0vPM6uHAIrQqdPX7S0bxbzJSUx75zpzaVdbIKXTWwTQVWLv1pp0UHspf42NWdOxTL0rdijfB-Dv0_GLav7nBKaf0JiUPMn8F6UM9490mfB3OFcuX4N921iJ8DPcPtrGGw1k7pP8jem0Q8jtkZ5UFK_hj2-975xoWxit931X1Njd4SufxO6Lp9efvwSL-huQJZLYFrAP__-twTGY8r9Xrp4QLhOKmHQaUJLn8Jz-HpgDoR0PAwKFGH2KARvj1LvwBuQdaOwDicFMsmCKkk4aoThNZg8DipjQcntqfGf5stIzAsxK2ZshPN8Uk6KLH_IZ6P9XNCyysZlScdsMqOCs2y2zcpxhnk529LxbCTnNKNFRvMiH-eT8SzNsSzy6cPkYYs8G-eCPGRYM6lSpbo6KDOKw3c-yco8Gym2ReXiuYnSflYVi8rGI48glBK6JJRafEHuXdIxJePb8Wpk5wEw2bY7Rx4yJZ13VxdeeoXzXkapubEWuVfH4dnK_ekkdT0AOGAWb-f_qLVqfpd86fftNuWmJnQdmJz-JY01gT6h6xi5I3Qdg_8_AAD__y2VKsA">