// { dg-do compile { target c++20 } } | |
template<typename T> | |
concept C = __is_class(T); | |
template<typename T> | |
concept D = C<T> and __is_empty(T); | |
template<template<typename Q> requires C<Q> class X> | |
struct S { }; | |
// An unconstrained template can be used as an argument for any | |
// constrained template template parameter. | |
template<typename A> struct T0 { }; | |
S<T0> x1; | |
// Matching constraints are valid. | |
template<typename A> requires C<A> struct T1 { }; | |
S<T1> x2; | |
int main() { } |