91 lines · cpp
1// RUN: %clang_cc1 -std=c++2a -verify %s2 3template<typename T> concept C = T::f(); // #C4template<typename T> concept D = C<T> && T::g();5template<typename T> concept F = T::f(); // #F6template<template<C> class P> struct S1 { }; // #S17 8template<C> struct X { };9 10template<D> struct Y { }; // #Y11template<typename T> struct Z { };12template<F> struct W { }; // #W13S1<X> s11;14S1<Y> s12;15// expected-error@-1 {{template template argument 'Y' is more constrained than template template parameter 'P'}}16// expected-note@#S1 {{'P' declared here}}17// expected-note@#Y {{'Y' declared here}}18S1<Z> s13;19S1<W> s14;20// expected-error@-1 {{template template argument 'W' is more constrained than template template parameter 'P'}}21// expected-note@#S1 {{'P' declared here}}22// expected-note@#W {{'W' declared here}}23// expected-note@#F 1-2{{similar constraint expressions not considered equivalent}}24// expected-note@#C 1-2{{similar constraint}}25 26template<template<typename> class P> struct S2 { };27 28S2<X> s21;29S2<Y> s22;30S2<Z> s23;31 32template <template <typename...> class C>33struct S3;34 35template <C T>36using N = typename T::type;37 38using s31 = S3<N>;39using s32 = S3<Z>;40 41template<template<typename T> requires C<T> class P> struct S4 { }; // #S442 43S4<X> s41;44S4<Y> s42;45// expected-error@-1 {{template template argument 'Y' is more constrained than template template parameter 'P'}}46// expected-note@#S4 {{'P' declared here}}47// expected-note@#Y {{'Y' declared here}}48S4<Z> s43;49S4<W> s44;50// expected-error@-1 {{template template argument 'W' is more constrained than template template parameter 'P'}}51// expected-note@#S4 {{'P' declared here}}52// expected-note@#W {{'W' declared here}}53 54template<template<typename T> requires C<T> typename U> struct S5 {55 template<typename T> static U<T> V;56};57 58struct Nothing {};59 60// FIXME: Wait the standard to clarify the intent.61template<> template<> Z<Nothing> S5<Z>::V<Nothing>;62 63namespace GH57410 {64 65template<typename T>66concept True = true;67 68template<typename T>69concept False = false; // #False70 71template <class> struct S {};72 73template<template<True T> typename Wrapper>74using Test = Wrapper<int>;75 76template<template<False T> typename Wrapper> // #TTP-Wrapper77using Test = Wrapper<int>; // expected-error {{constraints not satisfied for template template parameter 'Wrapper' [with T = int]}}78 79// expected-note@#TTP-Wrapper {{'int' does not satisfy 'False'}}80// expected-note@#False {{evaluated to false}}81 82template <typename U, template<False> typename T>83void foo(T<U>); // #foo84 85void bar() {86 foo<int>(S<int>{}); // expected-error {{no matching function for call to 'foo'}}87 // expected-note@#foo {{substitution failure [with U = int]: constraints not satisfied for template template parameter 'T' [with $0 = int]}}88}89 90}91