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

Reply via email to