https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105766
Bug ID: 105766 Summary: requires std::is_constructible<> reports 'constraint depends on itself' error. Product: gcc Version: 12.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: stream009 at gmail dot com Target Milestone: --- GCC reports following error on following code. |error: satisfaction of atomic constraint 'is_constructible_v<T, int> [with T = T]' depends on itself First of all, I can't decipher the error message. So I guessed, maybe root of trouble is the fact, at the time of instantiation of template baz (4), although parameter T = foo::bar is a complete type but its surrounding type foo is not. - If I uncomment (1), the error goes away, so it seems to become a problem only when the constraint is on a member function. - Also the error goes away too if I uncomment (2). - Most interestingly, error goes away if I comment out (3). - The code compile without error on clang. FYI, in real code, foo is thread pool, bar is worker, baz is container. // code // https://godbolt.org/z/M48ssEqvr #include <type_traits> template<typename T> //requires std::is_constructible_v<T, int> (1) struct baz { baz() = default; //template<typename = void> // (2) baz(int) requires std::is_constructible_v<T, int> {} }; struct foo { struct bar { bar() = default; bar(foo&); // (3) bar(int); }; baz<bar> m_bars; // (4) }; int main() { foo a; (void)a; }