https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115746

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
BTW, with a modified version of fold-constr5.C which doesn't involve any fold
expanded constraints:
struct A {
  using type = int;
};
struct B {
  using type = long;
};

template <class T> concept C = true;

template <class T, class U> requires (C<typename U::type> && C<typename
T::type>)       // { dg-error "is not a class, struct, or union type" }
constexpr bool bar () { return true; };

static_assert (bar <A, B> ());
static_assert (bar <int, int> ());      // { dg-error "no matching function for
call" }
static_assert (bar <B, long> ());       // { dg-error "no matching function for
call" }
static_assert (bar <unsigned, A> ());   // { dg-error "no matching function for
call" }

template <class T, class U> requires (C<typename T::type> && C<typename
U::type>)       // { dg-error "is not a class, struct, or union type" }
constexpr bool baz () { return true; };

static_assert (baz <B, A> ());
static_assert (baz <int, long> ());     // { dg-error "no matching function for
call" }
static_assert (baz <B, long> ());       // { dg-error "no matching function for
call" }
static_assert (baz <unsigned, A> ());   // { dg-error "no matching function for
call" }

template <class T, class U> requires (C<typename U::type> || C<typename
T::type>)       // { dg-error "is not a class, struct, or union type" }
constexpr bool corge () { return true; };

static_assert (corge <B, A> ());
static_assert (corge <int, int> ());    // { dg-error "no matching function for
call" }
static_assert (corge <B, long> ());
static_assert (corge <unsigned, A> ());

template <class T, class U> requires (C<typename T::type> || C<typename
U::type>)       // { dg-error "is not a class, struct, or union type" }
constexpr bool garply () { return true; };

static_assert (garply <B, A> ());
static_assert (garply <int, int> ());   // { dg-error "no matching function for
call" }
static_assert (garply <B, long> ());
static_assert (garply <unsigned, A> ());

g++ accepts all of this without any errors (tried 10.1, 11.1, 12.1, 13.1, 14.1
and trunk), while clang++ rejects it at the dg-error lines;
and my (sure, limited) understanding suggests that it should not be satisfied.

Reply via email to