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;
}