blob: 9e45c5869172578695a1c953bce826ff9afee618 [file] [log] [blame]
// { dg-do compile { target c++20 } }
template<typename T>
concept integer = __is_same_as(T, int);
template<typename T>
concept subst = requires (T x) { requires true; };
template<typename T>
concept c1 = requires { requires integer<T> || subst<T&>; }; // { dg-message "in requirements" }
static_assert(requires { requires true; });
static_assert(requires { requires false; }); // { dg-error "static assertion failed" }
static_assert(requires { requires integer<int>; });
static_assert(requires { requires integer<void>; }); // { dg-error "static assertion failed" }
static_assert(requires { requires c1<int>; });
static_assert(requires { requires c1<bool>; });
static_assert(requires { requires c1<void>; }); // { dg-error "static assertion failed" }
static_assert(requires { requires subst<void&>; }); // { dg-error "cannot declare|failed" }
static_assert(c1<int>);
static_assert(c1<bool>);
static_assert(c1<void>); // { dg-error "static assertion failed" }
template<c1 T>
void f1() { }
template<typename T>
requires requires { requires integer<T> || subst<T&>; } // { dg-message "in requirements" }
void f2();
template<typename T>
struct data
{
template<c1 U>
void f1() {}
template<typename U>
requires requires { requires integer<U> || subst<U&>; } // { dg-message in requirements" }
void f2() {}
static_assert(requires { requires subst<T&>; }); // { dg-error "forming reference|failed" }
template<typename U>
constexpr bool test()
{
if constexpr (requires { requires subst<U&>; })
return true;
else
return false;
}
};
template<typename T>
constexpr bool check_for_resize(T &v, unsigned const n)
{
if constexpr (requires { v.resize(n); })
return true;
else
return false;
}
struct array { };
struct vector { void resize(int n); };
void test()
{
f1<int>();
f1<bool>();
f1<void>(); // { dg-error "no match" }
f2<int>();
f2<bool>();
f2<void>(); // { dg-error "no match" }
data<char> x;
x.f1<int>();
x.f1<bool>();
x.f1<void>(); // { dg-error "no matching function" }
x.f2<int>();
x.f2<bool>();
x.f2<void>(); // { dg-error "no matching function" }
data<void> fail;
data<int> t;
static_assert(t.test<int>());
static_assert(t.test<void>()); // { dg-error "static assertion failed" }
vector v;
static_assert(check_for_resize(v, 10));
array a;
static_assert(!check_for_resize(a, 10));
}