brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 7772eec Raw
90 lines · cpp
1// RUN: %clang_cc1 -std=c++2a -x c++ -verify %s2 3template<typename T> requires (sizeof(T) >= 4)4// expected-note@-1{{similar constraint expressions not considered equivalen}}5class A{}; // expected-note{{template is declared here}}6 7template<typename T> requires (sizeof(T) >= 4 && sizeof(T) <= 10)8// expected-note@-1{{similar constraint expression here}}9 10class A<T>{}; // expected-error{{class template partial specialization is not more specialized than the primary template}}11 12template<typename T>13concept C1 = sizeof(T) >= 4;14 15template<typename T> requires C1<T>16class B{};17 18template<typename T> requires (C1<T> && sizeof(T) <= 10)19class B<T>{};20 21template<typename T>22concept C2 = sizeof(T) > 1 && sizeof(T) <= 8;23 24template<typename T>25class C{};26 27template<typename T> requires C1<T>28class C<T>{};29 30template<typename T>31class D{}; // expected-note{{previous definition is here}}32 33template<typename T>34class D<T>{}; // expected-error{{class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list}} expected-error{{redefinition of 'D'}}35 36template<typename T> requires C1<T> // expected-note{{previous template declaration is here}}37class E{};38 39template<typename T> // expected-error{{requires clause differs in template redeclaration}}40class E<T>{}; // expected-error{{class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list}}41 42template<typename T>43struct F{ enum{ value = 1 }; };44 45template<typename T> requires C1<T> && C2<T>46struct F<T>{ enum{ value = 2 }; };47 48template<typename T> requires C1<T> || C2<T>49struct F<T>{ enum{ value = 3 }; };50 51static_assert(F<unsigned>::value == 2);52static_assert(F<char[10]>::value == 3);53static_assert(F<char>::value == 1);54 55template <unsigned I>56struct S {57  template <typename T>58  struct F {59    enum { value = 1 };60  };61 62  template <typename T>63    requires C1<T> && C2<T>64  struct F<T> {65    enum { value = 2 };66  };67 68  template <typename T>69    requires C1<T> || C2<T>70  struct F<T> {71    enum { value = 3 };72  };73};74 75static_assert(S<1>::F<unsigned>::value == 2);76static_assert(S<1>::F<char[10]>::value == 3);77static_assert(S<1>::F<char>::value == 1);78 79// Make sure atomic constraints subsume each other only if their parameter80// mappings are identical.81 82template<typename T, typename U> requires C2<T>83struct I { }; // expected-note {{template is declared here}}84 85template<typename T, typename U> requires C2<U>86struct I<T, U> { }; // expected-error {{class template partial specialization is not more specialized than the primary template}}87 88template<typename T, typename U> requires C2<T> && C2<U>89struct I<T, U> { };90