<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/112848>112848</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang++17 crashes on valid c++20 code, clang++-18 refuses it with an erroneous error message
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Julien-Blanc-tgcm
</td>
</tr>
</table>
<pre>
I ran into clang++ refusing our code (accepted by gcc), with an error `out-of-line definition of <custom_function> does not match any declaration in <custom_class> ` for clang++-18, and a crash for clang++-17. We are pretty sure our code is valid c++ (and it is accepted by clang++-19).
The error seems related to an out-of-line definition of a template function, inside a variadic template class, with a requirement on the template argument of the function depending on the arguments of the class.
The following code is a minimal code sample reproducing the issue :
```
#include <type_traits>
#include <iostream>
namespace a
{
namespace details
{
template <typename T, typename... U>
concept Derived = std::conjunction_v<std::is_base_of<U, T>...>;
}
}
struct A
{
virtual void f() = 0;
};
namespace a
{
template <details::Derived<A> B>
struct S
{
S(B& b){ b.f(); }
};
struct B: public A
{
void f() override {
std::cout << "toto" << std::endl;
}
};
template<typename... SArgs>
struct Reproduce : protected SArgs..., protected S<SArgs...>
{
template<details::Derived<SArgs...> T, typename... FArgs>
void f(FArgs&&... args);
};
}
namespace a
{
template<typename... SArgs>
template<details::Derived<SArgs...> T, typename... FArgs>
void Reproduce<SArgs...>::f(FArgs&&... args)
{
(std::cout << ... << std::forward<FArgs>(args)) << std::endl;
}
}
int main()
{
a::B b;
a::S<a::B> s(b);
return 0;
}
```
It seems the namespaces are needed to trigger the crash. However, even if they are not present, the error happens. See https://godbolt.org/z/8K6oKqWv5 and https://godbolt.org/z/saajbns8d .
clang++-19 correctly accepts the code sample, as well as our code which triggers the same issue.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVs2OozgQfhrnUgoCk07CIYdOeqKdndv2jObYMnZBPDI2Y5u0sk-_siGE0D3dl5UiAq4f1_dV2VXMOVlrxB152JOHpwXr_MnY3d-dkqiXe8U0X_qaN4vSiMvuK1imQWpvgCuma0L3hO7BYtU5qWswnQVuBAKhW8Y5th4FlBeoOSe0IPQAr9KfgGlAa40Fsk5N55emWiqpEQRWUksvjQZTAckPvHPeNC9Vp3lYJfkXEAYdaOOhYZ4HVxcQyBWzLNpJPbHjijkXjMg6hcrYadDLbBviYVoAA26ZO73V2CTwE4FZhNai9xdwncUbSOngzJQUwAceAmotQPogmuK_81oQWiQkfSLpY__8fsKBD4fYOLCoWDD0JjD1Z4IYeGzaoAsjQ_QAUjspEBicmZVMSH5T6wkZ0wAWf3fSYoPag9HgT3jTZbbuekEVBdctQGCLWsR09yZXTXdVjdu8gVgZpcxrsLuyBwwaqWXDVL_kWNMqBIutNaLjQTW4k851CCR_nHok63T49Z80l5qrLtRefvCXFl-8ZdKH9L-nIY3zFllzE8enZg26lnEENixv9nOJQM-kcjP5yNuwfdCH74Hr61eSJPBj3I8bHeoDntDKMwog-RM4LwLKPAh_DXS_nEl-GAXSvZTM4YupSH74Ebx_J_mXJEmC33x_jelp_hKfztuOe3icRQ4AcJbWd0zB2UgBFaFbQosYUnrndXz_hKwpGVe6YvwDWpIfHsO53I90DLE9zxyRtHgmdLsndA1luEI2eyiTIUCS7-EO6314g8s9yR-h7Uol-fvQp5DNGa0Np2cawSQtnQ-QSH4AQqk33hBKryujGmqhJrEUH8R4JWpSNKFMnh9t7ebc_DMci3gUoLXGIw_XRFQOJUAP01WSH0bJWOQTVJOt_5CiifnbSj7ehUjSYuSxl9A1oeugyOJX8UEdzcr087L6kK3_FVcENRI_ozS6_QDxG8oJ3b5bS8FoXkSVsa_MhnDHiOj26jkezo-KbvMEM26lDi1T6uHovImN9W72UE5Ld1gNxXRVCKw5QrflXVLTwqLvrJ5dGO9e1fH51Q_dLtzwY8pd7LYaUfT9z1tZ12j7rhKadAJ_mVc8ow15wzNqkLHnXHpD40Ordqh9zOvYWE-sbVG7BJ4R4eR9G4uCHgk91kaURvnE2JrQ47-EHrff1ubb75_nhzgdfKruGPtVarcVcNfy7ns-cGMtcq8uw2DQA5-0vTiNOHhFpcL_OGW8niQ_XYnorVzoLbEr3u24ELtcFHnBFrjLNrSg-Tqj2eK0K7IyY9lKsM3DQ_aAVUUpX61Evs7KalMUbCF3NKWrLM226YbSNEvKTbFal2lWCuRC0JSsUmyYVIlS5yZgX8Ttd1lGt6vtQrESlYszJKUDcBrGSbsLBsuyqx1ZpUo6724uvPQKd4cbT9mmTzK6MFrczVY0jWwEku6HuH74RBemrulwqdF0bsh-g86xGhedVbtZNqU_dWXCTUPoMQQ2_C1ba34h94QeI1BH6HHAet7R_wIAAP__BHxafA">